按位运算符
按位运算符对数据的位值执行操作。这些运算符将操作数符号的 32 位整数的二进制补码 。
转换为 32 位整数
超过 32 位的数字会丢弃其最高有效位。例如,以下超过 32 位的整数将转换为 32 位整数:
Before: 10100110111110100000000010000011110001000001
After: 10100000000010000011110001000001
二进制的补充
在正常二进制中,我们通过将 1
基于它们的位置作为 2
的幂来添加二进制值 - 最右边的位是 2^0
到最左边的位是 2^n-1
,其中 n
是位数。例如,使用 4 位:
// Normal Binary
// 8 4 2 1
0 1 1 0 => 0 + 4 + 2 + 0 => 6
两个补码的格式意味着数字的负对应(6 对 -6)是倒数的所有位加 1。6 位的反转位是:
// Normal binary
0 1 1 0
// One's complement (all bits inverted)
1 0 0 1 => -8 + 0 + 0 + 1 => -7
// Two's complement (add 1 to one's complement)
1 0 1 0 => -8 + 0 + 2 + 0 => -6
注意: 在二进制数字的左侧添加更多 1
并不会改变它在两个恭维中的值。1010
和 1111111111010
的值都是 -6
。
按位 AND
按位 AND 操作 a & b
返回带有 1
的二进制值,其中两个二进制操作数在特定位置具有 1
,而在所有其他位置具有 0
。例如:
13 & 7 => 5
// 13: 0..01101
// 7: 0..00111
//-----------------
// 5: 0..00101 (0 + 0 + 4 + 0 + 1)
真实世界的例子:数字的奇偶校验
这不是个杰作(不幸的是在很多真正的代码部分经常看到):
function isEven(n) {
return n % 2 == 0;
}
function isOdd(n) {
if (isEven(n)) {
return false;
} else {
return true;
}
}
你可以更有效和简单的方式检查(整数)数字的奇偶校验:
if(n & 1) {
console.log("ODD!");
} else {
console.log("EVEN!");
}
按位 OR
按位 OR 运算 a | b
返回带有 1
的二进制值,其中操作数或两个操作数在特定位置具有 1
,而当两个值在某个位置具有 0
时 0
。例如:
13 | 7 => 15
// 13: 0..01101
// 7: 0..00111
//-----------------
// 15: 0..01111 (0 + 8 + 4 + 2 + 1)
按位 NOT
按位 NOT 操作~a
翻转给定值 a
的位。这意味着所有的 1
将成为 0
的所有 0
将成为 1
的。
~13 => -14
// 13: 0..01101
//-----------------
//-14: 1..10010 (-16 + 0 + 0 + 2 + 0)
按位异或
按位 XOR( 异或 )操作 a ^ b
仅在两个位不同时才放置 1
。排他性或意味着一种或另一种,但不是两种。
13 ^ 7 => 10
// 13: 0..01101
// 7: 0..00111
//-----------------
// 10: 0..01010 (0 + 8 + 0 + 2 + 0)
真实世界的例子:交换两个整数值而无需额外的内存分配
var a = 11, b = 22;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log("a = " + a + "; b = " + b);// a is now 22 and b is now 11