Hoạt động Bitwise trong JavaScript
Toán tử Bitwise JavaScript
Operator | Name | Description |
---|---|---|
& | AND | Sets each bit to 1 if both bits are 1 |
| | OR | Sets each bit to 1 if one of two bits is 1 |
^ | XOR | Sets each bit to 1 if only one of two bits is 1 |
~ | NOT | Inverts all the bits |
<< | Zero fill left shift | Shifts left by pushing zeros in from the right and let the leftmost bits fall off |
>> | Signed right shift | Shifts right by pushing copies of the leftmost bit in from the left, and let the rightmost bits fall off |
>>> | Zero fill right shift | Shifts right by pushing zeros in from the left, and let the rightmost bits fall off |
Các ví dụ
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 Sử dụng Toán hạng Bitwise 32 bit
JavaScript lưu trữ các số dưới dạng số dấu phẩy động 64 bit, nhưng tất cả các phép toán bit đều được thực hiện trên số nhị phân 32 bit.
Trước khi thực hiện thao tác bitwise, JavaScript chuyển đổi số thành số nguyên có dấu 32 bit.
Sau khi thao tác bitwise được thực hiện, kết quả được chuyển đổi trở lại các số JavaScript 64 bit.
Các ví dụ trên sử dụng số nhị phân không dấu 4 bit. Bởi vì điều này ~ 5 trả lại 10.
Vì JavaScript sử dụng số nguyên có dấu 32 bit nên nó sẽ không trả về 10. Nó sẽ trả về -6.
00000000000000000000000000000101 (5)
1111111111111111111111111111111010 (~ 5 = -6)
Một số nguyên có dấu sử dụng bit ngoài cùng bên trái làm dấu trừ.
Bitwise VÀ
Khi một bit theo chiều AND được thực hiện trên một cặp bit, nó sẽ trả về 1 nếu cả hai bit đều là 1.
Hoạt động | Kết quả |
---|---|
0 & 0 | 0 |
0 & 1 | 0 |
1 & 0 | 0 |
1 & 1 | 1 |
Hoạt động | Kết quả |
---|---|
1111 & 0000 | 0000 |
1111 & 0001 | 0001 |
1111 & 0010 | 0010 |
1111 & 0100 | 0100 |
Bitwise HOẶC
Khi một bit OR được thực hiện trên một cặp bit, nó sẽ trả về 1 nếu một trong các bit là 1:
Hoạt động | Kết quả |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Hoạt động | Kết quả |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
Bitwise XOR
Khi một XOR theo chiều bit được thực hiện trên một cặp bit, nó sẽ trả về 1 nếu các bit khác nhau:
Hoạt động | Kết quả |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
Hoạt động | Kết quả |
---|---|
1111 ^ 0000 | 1111 |
1111 ^ 0001 | 1110 |
1111 ^ 0010 | 1101 |
1111 ^ 0100 | 1011 |
JavaScript Bitwise AND (&)
Bitwise AND chỉ trả về 1 nếu cả hai bit đều là 1:
Số thập phân | Nhị phân |
---|---|
5 | 00000000000000000000000000000101 |
1 | 0000000000000000000000000000000001 |
5 & 1 | 00000000000000000000000000000001 (1) |
Thí dụ
let x = 5 & 1;
JavaScript Bitwise HOẶC (|)
Bitwise OR trả về 1 nếu một trong các bit là 1:
Số thập phân | Nhị phân |
---|---|
5 | 00000000000000000000000000000101 |
1 | 0000000000000000000000000000000001 |
5 | 1 | 00000000000000000000000000000101 (5) |
Thí dụ
let x = 5 | 1;
JavaScript Bitwise XOR (^)
Bitwise XOR trả về 1 nếu các bit khác nhau:
Số thập phân | Nhị phân |
---|---|
5 | 00000000000000000000000000000101 |
1 | 0000000000000000000000000000000001 |
5 ^ 1 | 00000000000000000000000000000100 (4) |
Thí dụ
let x = 5 ^ 1;
JavaScript Bitwise KHÔNG (~)
Số thập phân | Nhị phân |
---|---|
5 | 00000000000000000000000000000101 |
~ 5 | 1111111111111111111111111111111010 (-6) |
Thí dụ
let x = ~5;
JavaScript (Zero Fill) Bitwise Left Shift (<<)
Đây là sự dịch chuyển sang trái không điền. Một hoặc nhiều bit 0 được đẩy vào từ bên phải và các bit ngoài cùng bên trái rơi ra:
Số thập phân | Nhị phân |
---|---|
5 | 00000000000000000000000000000101 |
5 << 1 | 00000000000000000000000000001010 (10) |
Thí dụ
let x = 5 << 1;
JavaScript (Bảo quản Dấu hiệu) Chuyển sang Phải theo Bitwise (>>)
Đây là một dấu hiệu bảo quản ca phải. Bản sao của bit ngoài cùng bên trái được đẩy vào từ bên trái và các bit ngoài cùng bên phải rơi ra:
Số thập phân | Nhị phân |
---|---|
-5 | 1111111111111111111111111111111011 |
-5 >> 1 | 1111111111111111111111111111111101 (-3) |
Thí dụ
let x = -5 >> 1;
JavaScript (Zero Fill) Shift Phải (>>>)
Đây là một sự thay đổi bên phải điền bằng không. Một hoặc nhiều bit 0 được đẩy vào từ bên trái và các bit ngoài cùng bên phải rơi ra:
Số thập phân | Nhị phân |
---|---|
5 | 00000000000000000000000000000101 |
5 >>> 1 | 00000000000000000000000000000010 (2) |
Thí dụ
let x = 5 >>> 1;
Số nhị phân
Các số nhị phân chỉ có một bit được thiết lập rất dễ hiểu:
Biểu diễn nhị phân | Giá trị thập phân |
---|---|
0000000000000000000000000000000001 | 1 |
00000000000000000000000000000010 | 2 |
00000000000000000000000000000100 | 4 |
00000000000000000000000000001000 | số 8 |
0000000000000000000000000000010000 | 16 |
00000000000000000000000000100000 | 32 |
00000000000000000000000001000000 | 64 |
Đặt thêm một vài bit nữa sẽ hiển thị mẫu nhị phân:
Biểu diễn nhị phân | Giá trị thập phân |
---|---|
00000000000000000000000000000101 | 5 (4 + 1) |
00000000000000000000000000001101 | 13 (8 + 4 + 1) |
00000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
Số nhị phân JavaScript được lưu trữ ở định dạng bổ sung của hai.
Điều này có nghĩa là một số âm KHÔNG phải là bitwise của số cộng với 1:
Biểu diễn nhị phân | Giá trị thập phân |
---|---|
00000000000000000000000000000101 | 5 |
1111111111111111111111111111111011 | -5 |
00000000000000000000000000000110 | 6 |
1111111111111111111111111111111010 | -6 |
00000000000000000000000000101000 | 40 |
1111111111111111111111111111011000 | -40 |
Chuyển đổi thập phân sang nhị phân
Thí dụ
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
Chuyển đổi nhị phân sang thập phân
Thí dụ
function bin2dec(bin){
return parseInt(bin, 2).toString(10);
}