位操作&&leecode 461. 汉明距离
位操作
& | ~ ^ >> << >>>运算符
& 按位与
有0则0
0 | 0 | 1 | 1 |
---|---|---|---|
0 | 1 | 0 | 1 |
0 | 0 | 0 | 1 |
调用Integer.toBinaryString()
函数输出二进制表示:
System.out.println(Integer.toBinaryString(12));
System.out.println(Integer.toBinaryString(8));
System.out.println(Integer.toBinaryString(12 & 8));
输出结果为:
1100
1000
1000
| 按位或
有1则1
0 | 0 | 1 | 1 |
---|---|---|---|
0 | 1 | 0 | 1 |
0 | 1 | 1 | 1 |
调用Integer.toBinaryString()
函数输出二进制表示:
System.out.println(Integer.toBinaryString(12));
System.out.println(Integer.toBinaryString(8));
System.out.println(Integer.toBinaryString(12 | 8));
输出结果为:
1100
1000
1100
~ 按位取反
0 | 1 |
---|---|
1 | 0 |
调用Integer.toBinaryString()
函数输出二进制表示:
System.out.println(Integer.toBinaryString(8));
System.out.println(Integer.toBinaryString(~ 8));
输出结果为:
1000
11111111111111111111111111110111
为什么输出会这样呢?阿巴阿巴阿巴…只看后四位好不好
^ 异或
0 | 0 | 1 | 1 |
---|---|---|---|
0 | 1 | 0 | 1 |
0 | 1 | 1 | 0 |
调用Integer.toBinaryString()
函数输出二进制表示:
System.out.println(Integer.toBinaryString(12));
System.out.println(Integer.toBinaryString(8));
System.out.println(Integer.toBinaryString(12 ^ 8));
输出结果为:
1100
1000
100
你个***又翻车,,,最后一行看成0110好不好
<< 左移
12<<1演示:
向左移动1位,右边补0
12 | 1 | 1 | 0 | 0 | |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | ||
24 | 1 | 1 | 0 | 0 | 0 |
相当于1221,即m<<n
相当于m2n,左移几位就是乘2的几次
>> 右移
12>>1演示:
向右移动1位,左边补符号位(负数补1,正数补0)
12 | 1 | 1 | 0 | 0 | 舍弃 |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | ||
6 | 0 | 1 | 1 | 0 | 0 |
左移几位就是除2的几次
>>> 无符号右移
-12>>>1演示:
向右移动1位,左边补0
System.out.println(Integer.toBinaryString(-12));
System.out.println(Integer.toBinaryString(-12>>>1));
输出结果为:
11111111111111111111111111110100
1111111111111111111111111111010
最后一行应该为01111111111111111111111111111010
461. 汉明距离
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 231.
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
解答:
class Solution {
public int hammingDistance(int x, int y) {
int num = x ^ y;
int count = 0;
while(num!=0){
if((num&1)==1) count++;
num = num>>1;
}
return count;
}
}