JavaScript位运算

什么是位运算

现代计算机中所有的数据都以二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都叫位运算,即将符号位共同参与运算的运算。

位运算 AND

当对一对数位执行位运算 AND 时,如果数位均为 1 则返回 1。

1、单位示例:

运算 结果
0 & 0 0
0 & 1 0
1 & 0 0
1 & 1 1

2、四位示例:

运算 结果
1111 & 0000 0000
1111 & 0001 0001
1111 & 0010 0010
1111 & 0100 0100

位运算 OR

当对一对数位执行位运算 OR 时,如果其中一位是 1 则返回 1:

1、单位示例:

运算 结果
0 0
0 1
1 0
1 1

2、四位示例:

运算 结果
1111 0000
1111 0001
1111 0010
1111 0100

位运算 XOR

当对一对数位进行位运算 XOR 时,如果数位是不同的则返回 1:

1、单位示例:

运算 结果
0 ^ 0 0
0 ^ 1 1
1 ^ 0 1
1 ^ 1 0

2、四位示例:

运算 结果
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 num1 = 5;  //binary: '101'
var num2 = 1;  //binary: '1'
var result = num1 & num2; 
console.log(result); //1

JavaScript 位运算 OR (|)

如果数位之一是 1,则位运算 OR 返回 1:

十进制 二进制
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 | 1 00000000000000000000000000000101 (=5)
var num1 = 5;  //binary: '101'
var num2 = 1;  //binary: '1'
var result = num1 | num2; 
console.log(result); //5

JavaScript 位运算 XOR (^)

如果数位是不同的,则 XOR 返回 1:

十进制 二进制
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 ^ 1 00000000000000000000000000000100 (=4)
var num1 = 5;  //binary: '101'
var num2 = 1;  //binary: '1'
var result = num1 ^ num2; 
console.log(result); //4

JavaScript 位运算 NOT (~)

十进制 二进制
5 00000000000000000000000000000101
~5 11111111111111111111111111111010 (=-6)
var num1 = 5;  //binary: '101'
console.log(~num1); //-6

JavaScript(零填充)位运算左移(«)

这是零填充的左移。一个或多个零数位从右被推入,最左侧的数位被移除:

十进制 二进制
5 00000000000000000000000000000101
5 « 1 00000000000000000000000000001010 (=10)
var num1 = 5;  //binary: '101'
console.log(num1 << 1); //10

JavaScript(有符号)位运算右移(»)

这是保留符号的右移。最左侧的数位被从左侧推入,最右侧的数位被移出:

十进制 二进制
-5 11111111111111111111111111111011
-5 » 1 11111111111111111111111111111101 (=-3)
var num1 = -5;  //binary: '11111111111111111111111111111011'
console.log(num1 >> 1); //-3

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

这是零填充的右移。一个或多个零数位从左侧被推入,最右侧的数位被移出:

十进制 二进制
5 00000000000000000000000000000101
5 »> 1 00000000000000000000000000000010 (=2)
var num1 = 5;  //binary: '101'
console.log(num1 >>> 1); //2

把十进制转换为二进制

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

测试:

var num1 = 35;
var num2 = 47;
var num1_bin = dec2bin(num1); //'100011'
var num2_bin = dec2bin(num2); //'101111'
var sum = num1 + num2; // 82;
var sum_bin = dec2bin(sum); //'1010010'

把二进制转换为十进制

var bin2dec = (bin) => {
  return parseInt(bin, 2).toString(10);
};

测试:

var num1_bin = '100011';
var num2_bin = '101111';
var sum_bin = '1010010';

var num1 = bin2dec(num1_bin); //'35'
var num2 = bin2dec(num2_bin); //'47'
var sum = bin2dec(sum_bin);   //'82'

More

位运算
https://www.runoob.com/w3cnote/bit-operation.html

JavaScript位运算
https://www.w3school.com.cn/js/js_bitwise.asp