什么是位运算
现代计算机中所有的数据都以二进制的形式存储在设备中。即 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