位运算总结

位运算总结

191.位1的个数题解 位运算

  1. 按位与 &
    按位与运算将参与运算的两数对应的二进制位相与,当对应的二进制位均为 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,结果位为 1,否则结果位为 0。
0000 0011 | 0000 0111 = 0000 0111
  1. 按位异或 ^
    按位异或运算将参与运算的两数对应的二进制位相异或,当对应的二进制位值不同时,结果位为 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
  1. 按位取反 ~
    按位取反运算将二进制数的每一个位上面的 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)

  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

这里也体现了一点,位运算符的优先级 >> 大于 & 的优先级

  1. 位掩码

版权声明:本文为F_Felix原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。