JavaScript位运算



JavaScript 位运算符

运算符 描述 实例 等同于 结果 等同于
& 5 & 1 0101 & 0001  1 0001
| 5 | 1 0101 | 0001  5 0101
~ ~ 5  ~0101  10 1010
^ 亦或 5 ^ 1 0101 ^ 0001  4 0100
<< 0填充左移位 5 << 1 0101 << 1  10 1010
>> 有符号右移位 5 >> 1 0101 >> 1   2 0010
>>> 0填充右移位 5 >>> 1 0101 >>> 1   2 0010

上面的例子使用4位无符号的例子。但JavaScript使用32位的有符号数.

因为这个, 在JavaScript里面, ~ 5 将不返回 10. 它将返回 -6.

~00000000000000000000000000000101 将返回 11111111111111111111111111111010


按位与

按位与, 两个位都为1,则返回1.

一位实例:

操作结果
0 & 00
0 & 10
1 & 00
1 & 11

4 位实例:

操作结果
1111 & 00000000
1111 & 00010001
1111 & 00100010
1111 & 01000100

按位或

按位或, 有一个为1,就返回1:

1位实例:

操作结果
0 | 00
0 | 1
1 | 01
1 | 11

4 位结果:

操作结果
1111 | 00001111
1111 | 00011111
1111 | 00101111
1111 | 01001111

按位亦或

按位亦或, 如果两个不相同则返回1,否则返回0:

1位实例:

操作结果
0 ^ 00
0 ^ 1
1 ^ 01
1 ^ 1

4 为实例:

操作结果
1111 ^ 00001111
1111 ^ 00011110
1111 ^ 00101101
1111 ^ 01001011

JavaScript 位操作

JavaScript 按位运算在32位有符号整数.

运算中的任何数转换成32位有符号整数.

位运算结果转换为JavaScript数字.


JavaScript 按位与 (&)

按位与,两个位都为1,返回1:

数字二进制
500000000000000000000000000000101
100000000000000000000000000000001
5 & 100000000000000000000000000000001 (1)
var x = 5 & 1;

让我试试


JavaScript 按位或 (|)

按位或,有一个为1,则返回1:

数字二进制
500000000000000000000000000000101
100000000000000000000000000000001
5 | 100000000000000000000000000000101 (5)
var x = 5 | 1;

让我试试

JavaScript 按位亦或 (^)

按位亦或,不相同返回1,否则返回0:

数字二进制
500000000000000000000000000000101
100000000000000000000000000000001
5 ^ 100000000000000000000000000000100 (4)
var x = 5 ^ 1;

让我试试


JavaScript 按位取反 (~)

数字二进制
500000000000000000000000000000101
~511111111111111111111111111111010 (-6)
var x = 5 ^ 1;

让我试试


JavaScript 左移位 (<<)

这是零填充左移位. 一个或多个零位从右边移到左边,而左边的位删除:

数字二进制
500000000000000000000000000000101
5 << 100000000000000000000000000001010 (10)
var x = 5 << 1;

让我试试


JavaScript 右移位 (>>)

这是一个有符号右移位。:

数字二进制
-511111111111111111111111111111011
-5 >> 111111111111111111111111111111101 (-3)
var x = -5 >> 1;

让我试试


JavaScript (零填充) 右移位 (>>>)

(零填充) 右移位:

数字二进制
500000000000000000000000000000101
5 >>> 100000000000000000000000000000010 (2)
var x = 5 >>> 1;

让我试试


32位有符号整数

只有一位集的32位整数易于理解:

二进制描述数字
000000000000000000000000000000011
000000000000000000000000000000102
000000000000000000000000000001004
000000000000000000000000000010008
0000000000000000000000000001000016
0000000000000000000000000010000032
0000000000000000000000000100000064

设置多个位显示二进制模式:

二进制表示数字
000000000000000000000000000001015 (4 + 1)
0000000000000000000000000010100040 (32 + 8)
0000000000000000000000000010110145 (32 + 8 + 4 + 1)

负数存储在两个补码格式中。这意味着,一个负数位数不加1.

二进制表示数值
000000000000000000000000000001015
11111111111111111111111111111011-5
0000000000000000000000000010100040
11111111111111111111111111011000-40

十进制转换为二进制

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

让我试试


二进制转换为十进制

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

让我试试