常见的位运算操作

1. 给一个数n,确定它的二进制表示中的第x位是0还是1

一个数字n的二进制为: 0110 1010 01
要确定某一个数字是0还是1,只需要将n这个数字右移s位,(n >> s) & 1 是否等于0进行判断即可

2. 将一个数n的二进制表示的第x位修改成1/0

一个数字n的二进制为: 0110 1010 01
如果说要将这个n的某一位由0变成1.
可以先将1左移x位,使n的二进制中要从0变成1的位与1左移x位后相对应,然后将n |= (1 << x)
就可以将n的某一位由0变成1了。

一个数字n的二进制为: 0110 1010 01
如果说要将这个n的某一位由1变成0.
跟上面思路一样,最终结果为 n &= ~(1 << x);

0110 1010 01 (n)
0000 1000 00 (1 << x)
将(1 << x)按位取反变成
1111 0111 11
在&n
0110 0010 01

3. 位图的思想

一个int是4个字节,32个比特位。

每一个比特位可以表示一种状态,比如说26个字母,给我们了一个字符串,要判断字符串中是否出现了相同的字符(只有小写字母),这个时候可以使用位图的思想来解决,每一个字母用int中的一个比特位来表示,32 > 26 不会出现重复的情况,每出现一个字母,就将对应的比特位改为1,如果出现相同的,做对应的处理即可。

4. 提取一个数(n)二进制表示中最右侧的1

一个数字n的二进制为: 0110 1010 00
提取最右侧的1
这个算法有一个名字,叫lowbit
n & -n可以完成
-n为负数,在源码中,最高位位1,其他位按位取反 + 1得到补码,计算机中数字的加法就是通过补码进行计算的。
1……110 1010 00 -n的源码
1……001 0101 11 -n的反码
1……001 0110 00 -n的补码
因此-n会将最右侧的1,左边区域全部变成相反的
1……001 0110 00
0……110 1010 00

5. 干掉一个属二进制表示中最右侧的1

n & (n - 1)

011010100 (n)
011010011 (n - 1)
           &
--------------------
011010000

6. 异或运算的运算律

a ^ 0 = a
a ^ a = 0
a ^ b ^ c = a ^ (b ^ c)
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值