lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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次方,注意符号位被忽略了
posted on 2023-04-10 19:15  白露~  阅读(2)  评论(0编辑  收藏  举报