ตัวดำเนินการ shift ระดับบิตคือตัวดำเนินการ shift ขวา (>>) ซึ่งย้ายบิตของ shift_expression ไปทางขวา และตัวดำเนินการ shift ทางซ้าย (<<) ซึ่งย้าย บิตของ shift_expression ไปทางซ้าย
ตัวดำเนินการ shift ซ้ายทำให้บิตใน shift-expression ถูกเลื่อนไปทางซ้ายตามจำนวนตำแหน่งที่ระบุโดย additive-expression ตำแหน่งบิตที่ว่างโดยการดำเนินการกะจะถูกเติมเป็นศูนย์ การเลื่อนด้านซ้ายเป็นการเลื่อนแบบลอจิคัล (บิตที่เลื่อนออกจากส่วนท้ายจะถูกยกเลิก รวมถึงบิตเครื่องหมายด้วย)
ตัวดำเนินการ shift ขวาทำให้รูปแบบบิตใน shift-expression ถูกเลื่อนไปทางขวาตามจำนวนตำแหน่งที่ระบุโดย additive-expression สำหรับหมายเลขที่ไม่ได้ลงนาม ตำแหน่งบิตที่ว่างจากการดำเนินการกะจะถูกเติมเป็นศูนย์ สำหรับตัวเลขที่ลงนามแล้ว บิตเครื่องหมายจะใช้เพื่อเติมตำแหน่งบิตที่ว่าง กล่าวคือ หากตัวเลขเป็นบวก จะใช้ 0 และหากตัวเลขเป็นลบ จะใช้ 1
ตัวอย่าง
#include<iostream>
using namespace std;
int main() {
int a = 1, b = 3;
// a right now is 00000001
// Left shifting it by 3 will make it 00001000, ie, 8
a = a << 3;
cout << a << endl;
// Right shifting a by 2 will make it 00000010, ie, 2
a = a >> 2;
cout << a << endl;
return 0;
} ผลลัพธ์
สิ่งนี้จะให้ผลลัพธ์ -
8 2
โปรดทราบว่าตัวดำเนินการเหล่านี้มีพฤติกรรมแตกต่างกันมากกับจำนวนลบ ผลลัพธ์ของการเลื่อนไปทางขวาของจำนวนลบที่มีเครื่องหมายนั้นขึ้นอยู่กับการนำไปปฏิบัติ หากคุณเปลี่ยนหมายเลขที่ลงนามไปทางซ้ายเพื่อให้บิตของเครื่องหมายได้รับผลกระทบ ผลลัพธ์จะไม่ถูกกำหนด
นอกจากนี้ยังมีตัวดำเนินการที่ซับซ้อน 2 ตัวที่สามารถใช้เพื่อกำหนดค่าให้กับค่าทางด้านซ้ายโดยตรง นี่คือตัวดำเนินการ <<=และตัวดำเนินการ>>=
อ้างถึง https://msdn.microsoft.com/en-us/library/336xbhcz.aspx สำหรับการตรวจสอบอย่างละเอียดของตัวดำเนินการกะ