左移
8 << 2
0000 1000 << 2 = 0010 0000 = 32
a左移n位其实就是相当于a乘以2的n次方
右移
24 >> 2
0001 1000 >> 2 = 0000 0110 = 6
a右移n位其实就是相当于a除以2的n次方
按位与 &
基本规则
相同为1,不同为0
例子:
0&0=1
0&1=0
1&0=0
1&1=1
3&5=0011&0101=0001
常见应用场景
1.将某个单元清零,即使所有二进制位为0,只需要跟各位都是0的数值按位与
2.取到一个数的指定位,例如获取 0000 0101的低四位,需要找一个数X,使得X的低四位都是1,0000 1111,然后按位与,0000 0101 & 0000 1111 = 0000 0101
3.判断奇数偶数只需要根据最末位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以使用这个数按位与1来判断,如果结果是1,那么就是奇数,如果结果是0,那么就是偶数
证明判断奇数偶数只需要根据最末位是0还是1,除最末位外,其余各位都是2的幂,因此都是偶数,偶数+偶数=偶数,如果最末位是0,那么偶数+0=偶数。如果末位是1,偶数+1=奇数
4.对第二个应用场景的一个特定情况,即判断某个数的最低位是不是1,那么只需num & 1
例如 leetcode – 137. 只出现一次的数字 II的判断最低位元素部分
例如leetcode – 762. 二进制表示中质数个计算置位中判断元素最低位是不是1部分
按位或 |
基本规则
只要有一个为1,就是1
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
3 | 5 = 0011 | 0101 = 0111 = 7
常见应用场景
1.将某些单元设置为1,只需要跟各位都是1的数值按位或,例如将 0000 0101的低四位全部设置为1,那么就可以找一个数0000 1111,两个数按位或,得到0000 1111
异或 ^
基本规则
相同为0,相异为1
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
3 ^ 5 = 0011 ^ 0101 = 0110 = 6
3 ^ 0 = 0011 ^ 0000 = 0011 = 3
异或的性质包括:
1.交换律 a ^ b = b ^ a
2.结合律 (a ^ b) ^ c = a ^ (b ^ c)
3.a ^ a = 0
4.a ^ 0 = a
5.a ^ b ^ b = a ^ 0 = a
常见应用场景
1.翻转指定位,如将 0000 0101的低四位进行翻转,可以找一个低四位都是1其他位是0的数进行异或
0000 0101 ^ 0000 1111 = 0000 1010
leetcode举例:
取反 ~
基本规则
0变1,1变0
~1 = 0
~0 = 1
~ 3 = ~0011 = 1100 = 12
取反运算优先级高于其他运算
常见应用场景
1.将某个数最低位设置为0
例如需要设置3 即 0000 0011的最低位是0
那么就先需要一个1 即 0000 0001
然后对1取反 ~1 即 1111 1110
然后将3和-1取按位与
0000 0011 & 1111 1110 = 0000 0010