位运算基本规则、常见应用场景以及部分对应leetcode题目整理

左移

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

例如leetcode – 137. 只出现一次的数字 II的构建答案部分

异或 ^

基本规则

相同为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举例:

例如leetcode – 476. 数字的补数的构建答案部分

取反 ~

基本规则

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值