来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/hamming-distance
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
先将两个数异或运算得到n,那么n里面1的个数就是结果,如果n不为0,那么n至少有一位是1。如果n减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1。其余所有位将不会受到影响。这样右边这部分的&运算结果就为0,然后循环
int n=x^y;
int count=0;
while(n!=0){
count++;
n=n&(n-1);
}
return count;
作者:Charcl
链接:https://leetcode-cn.com/problems/two-sum/solution/xian-jiang-liang-ge-shu-yi-huo-yun-suan-ran-hou-za/
来源:力扣(LeetCode)
1.按位与(&)【有0则0】
运算规则:0&0=0;0&1=0;1&0=0;1&1=1;
用途:
(1)清零。如果想将一个单元清零,只需与一个各位都为0的数值相与即可。
(2)取出一个数的指定位。与上 一个指定位为1,其余位为0的数值即可。
例:设x=11101100,取x的低四位。令x&00001111=00001100
2.按位或(|)【有1则1】
运算规则:0|0=0;0|1=1;1|0=1;1|1=1;
用途:
(1)常用来对某些位置1。或上 一个指定位为1,其余位为0的数值即可。
例:设x=11101100,将x的低四位置1。令x|00001111=11101111
3.异或(^)【同0异1】
运算规则:00=0;01=1;10=1;11=0;
用途:
(1)使特定位翻转,异或上 一个要翻转位数为1,其余位为0的数值即可。
例:设x=11101100,将x的低四位翻转。令x^00001111=11100011
(2)与0异或,保留原值。
(3)基于异或运算,不引用新变量,交换两个变量的值
a=a^b;b=a^b;a=a^b(基于加减法还有:a=a+b;b=a-b;a=a-b)