文章目录
异或
二进制中异或,0^0 = 0 , 0异或1 和1异或1都为1
a ^ b = n
a = 8 的二进制是 1000,b = 13 的二进制是 1101。
得到 n = 0101
- 在n的二进制中:ab不同的位为1,相同的位为0
-
- 汉明距离
-
- a^b----还相当于 二进制的无进位相加,得到0101
a ^ a = 0; a ^ 0 = a
-
- 只出现一次的数字
与运算
二进制位对应& 则1&1为1,1&0,0&0都为0
a & b = n
在n的二进制中:ab位都是1的时候n对应的位为1,其余的位为0
(n & 1) == 0
判断最后一位是0还是1
(n & 1) == 0说明n是偶数
(n & 1) == 1则n是奇数
-
- Pow(x, n)
n = n & (n - 1)
这个操作是算法中常见的,作用是去掉数字 n 的二进制表示中的最后一个 1。
统计整数n二进制中1的个数
while(n != 0) {
n = n & (n - 1); //消除n的二进制的最后一个1
count++;
}
-
- 位1的个数
-
- 比特位计数(dp)
-
- 2的幂(2的n次方,则说明这个数二进制只有第一位是1,反之也成立)
-
- 4的幂(先判断是否是2的幂,然后判断奇数位是1)
n = n & (-n)
类似于上面的但是他是只保留了n的二进制中的最后一个1,比如0010,前面的1都去掉,只保留最后一个1
-
- 只出现一次的数字 III
(a&b)<<1
求的是a+b的二进制进位数,得到10000
-
- 两整数之和
- 剑指 Offer 65. 不用加减乘除做加法
左右移位
位运算速度要大于乘除法
n>>1 是n/2
n<<1是n*2