JavaScript การทำงานทางบิท

JavaScript การทำงานทางบิท

ประเภทการทำงาน ชื่อ บรรยาย
& AND ถ้าทั้งสองตำแหน่งเป็น 1 ก็ตั้งแต่ทุกตำแหน่งเป็น 1
| OR ถ้าหนึ่งในสองตำแหน่งเป็น 1 ก็ตั้งแต่ทุกตำแหน่งเป็น 1
^ XOR ถ้าทั้งสองตำแหน่งมี 1 ตำแหน่งเท่านั้น ก็ตั้งแต่ทุกตำแหน่งเป็น 1
~ NOT ปรับปรุงทุกตำแหน่ง
<< เลื่อนข้างซ้ายด้วยการบอกเข้ามา 0 ผ่านการเลื่อนข้างซ้ายด้วยการบอกเข้ามา 0 และทำให้ตำแหน่งที่ด้านซ้ายขวางออกมา
>> เลื่อนข้างขวาสัญญาณ ผ่านการเลื่อนข้างขวาด้วยการบอกเข้ามาสำเนาตำแหน่งที่ด้านซ้ายขวางและทำให้ตำแหน่งที่ด้านขวาสุดออกมา
>>> เลื่อนข้างขวาด้วยการบอกเข้ามา 0 ผ่านการเลื่อนข้างขวาด้วยการบอกเข้ามา 0 และทำให้ตำแหน่งที่ด้านขวาสุดออกมา

ตัวอย่าง

ปฏิบัติการ ผลลัพธ์ เท่ากัน ผลลัพธ์
5 & 1 1 0101 & 0001 0001
5 | 1 5 0101 | 0001 0101
5 ^ 1 4 0101 ^ 0001 0100
~ 5 10 ~0101 1010
5 << 1 10 0101 << 1 1010
5 >> 1 2 0101 >> 1 0010
5 >>> 1 2 0101 >>> 1 0010

JavaScript ใช้ปฏิบัติการบิต 32 บิต

JavaScript จะเก็บเลขในรูปแบบเลขจำนวนเป็นจุด 64 บิต แต่ทุกปฏิบัติการบิตจะทำด้วย 32 บิตของเลขที่เก็บไว้นั้น。

ก่อนที่จะทำปฏิบัติการบิต JavaScript จะแปลงเลขเป็นเลขจำนวนเป็นสัญลักษณ์ 32 บิต。

หลังจากทำปฏิบัติการบิต ผลลัพธ์จะถูกแปลงกลับเป็นเลขจำนวน JavaScript 64 บิต。

ตัวอย่างดังกล่าวใช้เลขจำนวนบิตที่ไม่มีสัญลักษณ์ 4 บิต ดังนั้น ~5 จะคืนค่า 10。

เนื่องจาก JavaScript ใช้เลขจำนวนเป็นสัญลักษณ์ 32 บิต จึงจะคืนค่า -6。

00000000000000000000000000000101 (5)

11111111111111111111111111111010 (~5 = -6)

เลขจำนวนเป็นสัญลักษณ์ใช้บิตที่ด้านซ้ายสุดเป็นลูกศร。

ปฏิบัติการบิต AND

ขณะที่ทำปฏิบัติการบิต AND บิตทั้งหมดเป็น 1 จะคืนค่า 1。

ตัวอย่างขนาดหนึ่ง:

ปฏิบัติการ ผลลัพธ์
0 & 0 0
0 & 1 0
1 & 0 0
1 & 1 1

ตัวอย่างสี่บิต:

ปฏิบัติการ ผลลัพธ์
1111 & 0000 0000
1111 & 0001 0001
1111 & 0010 0010
1111 & 0100 0100

ปฏิบัติการบิต OR

ขณะที่ทำปฏิบัติการบิต OR บิตหนึ่งใดในบิตทั้งหมดเป็น 1 จะคืนค่า 1:

ตัวอย่างขนาดหนึ่ง

ปฏิบัติการ ผลลัพธ์
0 | 0 0
0 | 1 1
1 | 0 1
1 | 1 1

ปฏิบัติการสี่บิต:

ปฏิบัติการ ผลลัพธ์
1111 | 0000 1111
1111 | 0001 1111
1111 | 0010 1111
1111 | 0100 1111

ปฏิบัติการบิต XOR

ขณะที่ทำปฏิบัติการบิต XOR บิตทั้งหมดเป็นตัวแปลง จะคืนค่า 1:

ตัวอย่างขนาดหนึ่ง:

ปฏิบัติการ ผลลัพธ์
0 ^ 0 0
0 ^ 1 1
1 ^ 0 1
1 ^ 1 0

ตัวอย่างสี่บิต:

ปฏิบัติการ ผลลัพธ์
1111 ^ 0000 1111
1111 ^ 0001 1110
1111 ^ 0010 1101
1111 ^ 0100 1011

JavaScript ปฏิบัติการบิต AND (&)

ถ้าทั้งหมดเป็น 1 ในตำแหน่งบิต ปฏิบัติการบิต AND จะคืนค่า 1:

เลขฐานสิบ สองทศนิยม
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 & 1 00000000000000000000000000000001 (1)

ตัวอย่าง

var x = 5 & 1;

ลองทดสอบเอง

JavaScript ปฏิบัติการบิต OR (|)

ถ้าหนึ่งในตำแหน่งเลขเป็น 1 การประมวลผล OR จะกลับ 1:

เลขฐานสิบ สองทศนิยม
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 | 1 00000000000000000000000000000101 (5)

ตัวอย่าง

var x = 5 | 1;

ลองทดสอบเอง

XOR (^) ประมวลผลบิต JavaScript

ถ้าตำแหน่งเลขเป็นตัวแตกต่าง การ XOR จะกลับ 1:

เลขฐานสิบ สองทศนิยม
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 ^ 1 00000000000000000000000000000100 (4)

ตัวอย่าง

var x = 5 ^ 1;

ลองทดสอบเอง

NOT (~) ประมวลผลบิต JavaScript

เลขฐานสิบ สองทศนิยม
5 00000000000000000000000000000101
~5 11111111111111111111111111111010 (-6)

ตัวอย่าง

var x = ~5;

ลองทดสอบเอง

การเลื่อนซ้าย (<<) ด้วยการประมวลผลบิตที่มีการกรอบเติมศูนย์ JavaScript

นี่คือการเลื่อนซ้ายด้วยการกรอบเติมศูนย์ หนึ่งหรือหลายตำแหน่งศูนย์จากด้านขวาถูกขับเข้ามา และตำแหน่งที่ด้านซ้ายถูกถอดออกไป:

เลขฐานสิบ สองทศนิยม
5 00000000000000000000000000000101
5 << 1 00000000000000000000000000001010 (10)

ตัวอย่าง

var x = 5 << 1;

ลองทดสอบเอง

การเลื่อนขวา (>>) ด้วยการประมวลผลบิตที่มีสัญญาณ JavaScript

นี่คือการเลื่อนขวาที่รักษาสัญญาณ ตำแหน่งที่ด้านซ้ายถูกขับเข้ามาจากด้านซ้าย และตำแหน่งที่ด้านขวาถูกย้ายออกไป:

เลขฐานสิบ สองทศนิยม
-5 11111111111111111111111111111011
-5 >> 1 11111111111111111111111111111101 (-3)

ตัวอย่าง

var x = -5 >> 1;

ลองทดสอบเอง

เลื่อนขวา (>>>) ด้วยการกรอบเติมศูนย์ JavaScript

นี่คือการเลื่อนขวาด้วยการกรอบเติมศูนย์ หนึ่งหรือหลายตำแหน่งศูนย์จากด้านซ้ายถูกขับเข้ามา และตำแหน่งที่ด้านขวาถูกย้ายออกไป:

เลขฐานสิบ สองทศนิยม
5 00000000000000000000000000000101
5 >>> 1 00000000000000000000000000000010 (2)

ตัวอย่าง

var x = 5 >>> 1;

ลองทดสอบเอง

เลขจำนวนเต็ม 32 บิต มีสัญญาณ (เลขสองทศนิยม)

ที่มีเพียงตัวเลขหนึ่งของเลขจำนวนเต็ม 32 บิตส์ง่ายต่อการเข้าใจ:

ตัวแทนเลขสองทศนิยม ค่าเลขเศษสอง
00000000000000000000000000000001 1
00000000000000000000000000000010 2
00000000000000000000000000000100 4
00000000000000000000000000001000 8
00000000000000000000000000010000 16
00000000000000000000000000100000 32
00000000000000000000000001000000 64

จำนวนตำแหน่งเลขที่มากขึ้นเพิ่มเติมเปิดเผยรูปแบบของเลขสอง

ตัวแทนเลขสองทศนิยม ค่าเลขเศษสอง
00000000000000000000000000000101 5 (4 + 1)
00000000000000000000000000101000 40 (32 + 8)
00000000000000000000000000101101 45 (32 + 8 + 4 + 1)

เลขลบเป็นเลขบวกเสริมของเลขสองทศนิยมเพิ่ม 1:

ตัวแทนเลขสองทศนิยม ค่าเลขเศษสอง
00000000000000000000000000000101 5
11111111111111111111111111111011 -5
00000000000000000000000000101000 40
11111111111111111111111111011000 -40
11111111111111111111111111011001 -41

แปลงจากเลขเศษสองเป็นเลขสองทศนิยม

ตัวอย่าง

function dec2bin(dec){
    return (dec >>> 0).toString(2);
}

ลองทดสอบเอง

แปลงจากเลขสองทศนิยมเป็นเลขเศษสอง

ตัวอย่าง

function bin2dec(bin){
    return parseInt(bin, 2).toString(10);
}

ลองทดสอบเอง