位运算总结
- 按位与 &
按位与运算将参与运算的两数对应的二进制位相与,当对应的二进制位均为 1 时,结果位为 1,否则结果位为 0。
0000 0101 & 0000 1000 = 0000 0000
判断奇偶:这是因为奇数的二进制最低位始终为 1,而偶数的二进制最低为始终为 0。所以,无论任何奇数与 1 即 0000 0001 相与得到的都是 1,任何偶数与其相与得到的都是 0。
if( 3 & 1) {
// 奇数
} else {
// 偶数
}
/*
0011 & 0001 = 0001
0101 & 0001 = 0001
*/
- 按位或 |
按位或运算将参与运算的两数对应的二进制位相或,只要对应的二进制位中有 1,结果位为 1,否则结果位为 0。
0000 0011 | 0000 0111 = 0000 0111
- 按位异或 ^
按位异或运算将参与运算的两数对应的二进制位相异或,当对应的二进制位值不同时,结果位为 1,否则结果位为 0
0000 1100 ^ 0000 0111 = 0000 1011
变量交换
a = 3, b = 5
a = a ^ b
b = a ^ b
a = a ^ b
// 最后输出 a = 5, b = 3
- 按位取反 ~
按位取反运算将二进制数的每一个位上面的 0 换成 1,1 换成 0.
// 数字 9 按位取反
~0000 1001
= 0000 1001 // 补码,正数补码即原码
= 1111 1010 // 取反
= -10
// 数字 -20 按位取反
~0001 0100
= 1110 1011 + 1 // 负数的补码 = 负数的绝对值取反 + 1
= 1110 1100 # 补码
= 0001 0011 # 取反
= 19
由上可推出 -x = -(x + 1)
- 左移运算 <<
左移运算将数对应的二进位全部向左移动若干位,高位丢弃,低位补 0
5 << 4
= 0000 0101 << 4
= 0101 0000 // 高位丢弃,低位补 0
= 80 // 等价于 5 * 2^4 = 5 * 16 = 80
左移运算 x << n = x(2)^n
6. 右移运算 >>
右移运算将数对应的二进位全部向右移动若干位。对于左边的空位,如果是正数则补 0,负数可能补 0 或 1
80 >> 4
= 0101 0000 >> 4
= 0000 0101 // 正数补0,负数补1
= 5
右移运算正好是左移的逆运算,即 x >> n = x ÷ (2)^n
取 x 的第 k 位
// 即取数字 x 对应的二进制的第 k 位上的二进制值。假设数字为 5,其对应的二进制为 0000 0101,取第 k 位二进制值的位运算为 x >> k & 1
x = 5 // 0000 0101
for(let i = 0; i< 8; i++){
console.log( x >> i & 1)
}
// 1 0 1 0 0 0 0 0
这里也体现了一点,位运算符的优先级 >> 大于 & 的优先级
- 位掩码
版权声明:本文为F_Felix原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。