1.题目
这道题的考察点
是你对Java中位移运算符的理解和应用。
你需要知道左移、右移和无符号右移的区别,以及它们在二进制数上的效果。
你还需要注意负数的表示和处理,以及溢出的可能性。
2.解法
思路
这道题的目标是计算两个整数之间的汉明距离,也就是它们对应二进制位不同的个数。一个简单的方法是使用异或运算,它会把相同的位设为0,不同的位设为1,这正是我们需要找出的。然后我们可以用一个循环来统计异或结果中1的个数,这就是汉明距离
代码逻辑
- 首先,我用异或运算来得到两个整数的二进制表示中不同的位,因为异或运算的特点是相同的位为0,不同的位为1。
- 然后,我用一个循环来遍历异或结果的每一位,如果某一位为1,就说明这一位是不同的,那么我就把计数器加一。
- 最后,我返回计数器的值,这就是汉明距离。
具体实现
public class Solution { public int hammingDistance(int x, int y) { int count = 0; int z = x ^ y; // 异或运算 while (z != 0) { if ((z & 1) == 1) { // 判断最低位是否为1 count++; // 计数加一 } z = z >>> 1; // 无符号右移一位 } return count; // 返回汉明距离 } }
3.总结
关于Java中位移运算符的知识。
Java中的左移和右移运算符。左移运算符(<<)和右移运算符(>>)是用来对整数类型的数据进行位移操作的。左移运算符把一个数的所有位向左移动指定的位数,右边空出的位用0填充。右移运算符把一个数的所有位向右移动指定的位数,左边空出的位根据数的符号来填充,如果是正数就用0填充,如果是负数就用1填充。这样可以保持数的符号不变。例如:
int a = 10; // 00001010
int b = a << 2; // 00101000, 左移2位,相当于乘以2的2次方
int c = a >> 2; // 00000010, 右移2位,相当于除以2的2次方
int d = -10; // 11110110
int e = d << 2; // 11011000, 左移2位,相当于乘以2的2次方
int f = d >> 2; // 11111101, 右移2位,相当于除以2的2次方,注意符号位被扩展了
除了这两种运算符,Java还提供了一种无符号右移运算符(>>>),它不管数的符号,只是简单地把所有位向右移动指定的位数,左边空出的位用0填充。这样可以避免负数右移时出现意外的结果。例如:
int g = d >>> 2; // 00111101, 无符号右移2位,相当于除以2的2次方,注意符号位被忽略了