จาวาสคริปต์ Bitwise


สารบัญ

    แสดงสารบัญ


ตัวดำเนินการ Bitwise ของ JavaScript

&

ลอจิกและ ตั้งค่าแต่ละบิตเป็น 1 หากทั้งสองบิตเป็น 1

|

ลอจิกหรือ ตั้งค่าแต่ละบิตเป็น 1 หากหนึ่งในสองบิตเป็น 1

^

ลอจิก XOR ตั้งค่าแต่ละบิตเป็น 1 หากมีเพียงหนึ่งในสองบิตเท่านั้นที่เป็น 1

~

ลอจิกไม่ แปลงบิตทั้งหมด

<<

กะด้านซ้ายเติมศูนย์ เลื่อนไปทางซ้ายโดยการกดเลขศูนย์เข้ามาจากทางขวา และปล่อยให้บิตทางซ้ายสุดหลุดออกไป

>>

ลงนามกะขวา เลื่อนไปทางขวาโดยการกดสำเนาของบิตซ้ายสุดเข้ามาจากด้านซ้าย และปล่อยให้บิตขวาสุด หล่นจาก

>>>

เติมกะด้านขวาเป็นศูนย์ เลื่อนไปทางขวาโดยกดศูนย์เข้ามาจากทางซ้าย และปล่อยให้บิตขวาสุดหลุดออกไป

ตัวอย่าง

Operation Result Same as Result
5 & 1 1 0101 & 0001  0001
5 | 1 5 0101 | 0001  0101
~ 5 10  ~0101  1010
5 << 1 10 0101 << 1  1010
5 ^ 1 4 0101 ^ 0001  0100
5 >> 1 2 0101 >> 1  0010
5 >>> 1 2 0101 >>> 1  0010

JavaScript ใช้ตัวถูกดำเนินการ Bitwise 32 บิต

JavaScript เก็บตัวเลขเป็นตัวเลขทศนิยม 64 บิต แต่ทั้งหมดเป็นแบบบิต การดำเนินการจะดำเนินการกับเลขฐานสอง 32 บิต

ก่อนที่จะดำเนินการในระดับบิต JavaScript จะแปลงตัวเลขเป็น 32 บิต จำนวนเต็มลงนาม

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

ตัวอย่างข้างต้นใช้เลขฐานสองที่ไม่ได้ลงนามขนาด 4 บิต ด้วยเหตุนี้ ~ 5 จึงส่งคืน 10

เนื่องจาก JavaScript ใช้จำนวนเต็มที่มีเครื่องหมาย 32 บิต มันจะไม่ส่งคืน 10 แต่จะส่งคืน -6

0000000000000000000000000000101 (5)

11111111111111111111111111111010 (~5=-6)

จำนวนเต็มที่ลงนามจะใช้บิตซ้ายสุดเป็นเครื่องหมายลบ



จาวาสคริปต์ Bitwise และ

เมื่อดำเนินการตามระดับบิต 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


JavaScript Bitwise หรือ

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

0 | 0

0

0 | 1

1 | 0

1

1 | 1

1

1111 | 0000

1111

1111 | 0001

1111

1111 | 0010

1111

1111 | 0100

1111


จาวาสคริปต์ Bitwise XOR

เมื่อ XOR ระดับบิตถูกดำเนินการกับคู่ของบิต มันจะคืนค่า 1 หากบิตนั้นแตกต่างกัน:

0 ^ 0

0

0 ^ 1

1 ^ 0

1

1 ^ 1

1111 ^ 0000

1111

1111 ^ 0001

1110

1111 ^ 0010

1101

1111 ^ 0100

1011


จาวาสคริปต์ Bitwise และ (&)

Bitwise AND ส่งคืน 1 เฉพาะในกรณีที่ทั้งสองบิตเป็น 1:

5

00000000000000000000000000000101

1

00000000000000000000000000000001

5 & 1

0000000000000000000000000000001 (1)

ตัวอย่าง

let x = 5 & 1;

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise AND</h1>
<h2>The &amp; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 & 1;
</script>

</body>
</html> 

จาวาสคริปต์ Bitwise หรือ (|)

Bitwise OR ส่งคืน 1 ถ้าหนึ่งในบิตเป็น 1:

5

00000000000000000000000000000101

1

00000000000000000000000000000001

5 | 1

0000000000000000000000000000101 (5)

ตัวอย่าง

let x = 5 | 1;

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise OR</h1>
<h2>The | Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 | 1;
</script>

</body>
</html>

จาวาสคริปต์ Bitwise XOR (^)

Bitwise XOR ส่งคืน 1 หากบิตต่างกัน:

5

00000000000000000000000000000101

1

00000000000000000000000000000001

5 ^ 1

0000000000000000000000000000100 (4)

ตัวอย่าง

let x = 5 ^ 1;

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise XOR</h1>
<h2>The ^ Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 ^ 1;
</script>

</body>
</html>

JavaScript Bitwise ไม่ใช่ (~)

5

00000000000000000000000000000101

~5

11111111111111111111111111111010 (-6)

ตัวอย่าง

let x = ~5;

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise NOT</h1>
<h2>The ~ Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = ~ 5;
</script>

</body>
</html>

JavaScript (เติมศูนย์) Bitwise Shift ซ้าย (<<)

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

5

00000000000000000000000000000101

5 << 1

0000000000000000000000000001010 (10)

ตัวอย่าง

let x = 5 << 1;

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise Left</h1>
<h2>The &lt;&lt; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 << 1;
</script>

</body>
</html>

JavaScript (การรักษาเครื่องหมาย) การเลื่อนไปทางขวาแบบ Bitwise (>>)

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

-5

11111111111111111111111111111011

-5 >> 1

11111111111111111111111111111101 (-3)

ตัวอย่าง

let x = -5 >> 1;

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Signed Bitwise Right</h1>
<h2>The &gt;&gt; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = -5 >> 1;
</script>

</body>
</html>

JavaScript (เติมศูนย์) เลื่อนไปทางขวา (>>>)

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

5

00000000000000000000000000000101

5 >>> 1

0000000000000000000000000000010 (2)

ตัวอย่าง

let x = 5 >>> 1;

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Unsigned Bitwise Right</h1>
<h2>The &gt;&gt;&gt; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 >>> 1;
</script>

</body>
</html>

เลขฐานสอง

เลขฐานสองที่มีชุดบิตเดียวนั้นง่ายต่อการเข้าใจ:

00000000000000000000000000000001

1

00000000000000000000000000000010

2

00000000000000000000000000000100

4

00000000000000000000000000001000

8

00000000000000000000000000010000

16

00000000000000000000000000100000

32

00000000000000000000000001000000

64

การตั้งค่าอีกสองสามบิตจะแสดงรูปแบบไบนารี่:

00000000000000000000000000000101

5 (4 + 1)

00000000000000000000000000001101

13 (8 + 4 + 1)

00000000000000000000000000101101

45 (32 + 8 + 4 + 1)

หมายเลขไบนารี่ของ JavaScript จะถูกจัดเก็บในรูปแบบเสริมของสอง

ซึ่งหมายความว่าจำนวนลบจะเป็นค่าระดับบิต NOT ของจำนวนบวก 1:

00000000000000000000000000000101

5

11111111111111111111111111111011

-5

00000000000000000000000000000110

6

11111111111111111111111111111010

-6

00000000000000000000000000101000

40

11111111111111111111111111011000

-40

เรื่องตลก :

มีคนเพียง 10 ประเภทในโลกนี้: คนที่เข้าใจไบนารี่และคนที่ไม่เข้าใจ


การแปลงทศนิยมให้เป็นไบนารี

ตัวอย่าง

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

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Convert Decimal to Binary</h1>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = dec2bin(-5);
function dec2bin(dec){
  return (dec >>> 0).toString(2);
}
</script>

</body>
</html>

การแปลงไบนารีเป็นทศนิยม

ตัวอย่าง

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

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Convert Binary to Decimal</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = bin2dec(101);
function bin2dec(bin){
  return parseInt(bin, 2).toString(10);
}
</script>

</body>
</html>