Unsigned Right Shift Operator (>>>) ใน JavaScript
ตัวดำเนินการ Unsigned Right Shift (>>>) เลื่อนบิต (Bitwise Shift) ไปทางขวา และ เติม 0 ด้านซ้าย (MSB) เสมอ ไม่สนใจเครื่องหมาย (Sign Bit) ทำให้ผลลัพธ์เป็น Unsigned 32-bit Integer เสมอ
ความแตกต่างระหว่าง >> (Signed) และ >>> (Unsigned)
| Operator | ชื่อ | การเติมบิตด้านซ้าย | ผลลัพธ์ |
| >> | Signed Right Shift | คัดลอก Sign Bit (Preserve Sign) | Signed 32-bit Integer (อาจเป็นลบ) |
| >>> | Unsigned Right Shift | เติม 0 เสมอ (Zero Fill) | Unsigned 32-bit Integer (ไม่เป็นลบเลย) |
ตัวอย่างโค้ด
<html>
<body>
<script>
var a = -14; // Binary (32-bit): 11111111 11111111 11111111 11110010
var b = 2; // Shift right 2 bits
document.write("(a >>> b) => ");
result = (a >>> b);
document.write(result); // แสดงผล: 1073741820
</script>
</body>
</html>
คำนวณแบบมือ: -14 >>> 2
- -14 ใน 32-bit Two's Complement:
11111111 11111111 11111111 11110010
- เลื่อนขวา 2 บิต:
00111111 11111111 11111111 11111100 (เติม 0 ด้านซ้าย)
- ค่า Unsigned:
1073741820
เปรียบเทียบ: -14 >> 2 = -4 (Sign Preserved: 11111111 11111111 11111111 11111100)
ตัวอย่างเพิ่มเติม
console.log(14 >>> 1); // 7 (00001110 -> 00000111)
console.log(-14 >>> 1); // 2147483641 (เติม 0 ด้านซ้าย)
console.log(0 >>> 5); // 0
console.log(-1 >>> 0); // 4294967295 (Max Uint32: 0xFFFFFFFF)
console.log(255 >>> 8); // 0
console.log(0xFFFFFFFF >>> 0); // 4294967295 (Convert to Uint32)
การประยุกต์ใช้งานจริง
- แปลง Signed เป็น Unsigned 32-bit:
value >>> 0
- Bitmask Operations: จัดการ Flags, Permissions, Color Values (RGBA)
- Hashing/Checksum Algorithms: CRC32, MurmurHash, จำเป็นต้องใช้ Unsigned Math
- Network Programming: IP Address Manipulation, Packet Parsing
- Performance: บางกรณีเร็วกว่า Math.floor สำหรับ Positive Numbers
ข้อควรระวัง
- JavaScript จัดเก็บตัวเลขเป็น IEEE 754 Double (64-bit Float) แต่ Bitwise Operators ทำงานบน 32-bit Signed Integer แล้วคืนค่าเป็น Number (Float)
>> 0 เป็น Idiom ยอดนิยมสำหรับแปลงค่าใดๆ ให้เป็น Unsigned 32-bit Integer
- ไม่ควรใช้กับตัวเลขใหญ่กว่า 2^53-1 (Safe Integer Limit) จะสูญเสีย Precision
สรุป
>>> (Signed Right Shift) รักษาเครื่องหมาย >>> (Unsigned Right Shift) เติม 0 ด้านซ้ายเสมอ ผลลัพธ์เป็น Unsigned 32-bit Integer ใช้ใน Bit Manipulation, Hashing, Network Code และแปลง Signed → Unsigned