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)