1.题目
这道题的考察点
是你对Java中位移运算符的理解和应用。
你需要知道左移、右移和无符号右移的区别,以及它们在二进制数上的效果。
你还需要注意负数的表示和处理,以及溢出的可能性。
2.解法
思路
这道题的目标是计算两个整数之间的汉明距离,也就是它们对应二进制位不同的个数。一个简单的方法是使用异或运算,它会把相同的位设为0,不同的位设为1,这正是我们需要找出的。然后我们可以用一个循环来统计异或结果中1的个数,这就是汉明距离
代码逻辑
- 首先,我用异或运算来得到两个整数的二进制表示中不同的位,因为异或运算的特点是相同的位为0,不同的位为1。
- 然后,我用一个循环来遍历异或结果的每一位,如果某一位为1,就说明这一位是不同的,那么我就把计数器加一。
- 最后,我返回计数器的值,这就是汉明距离。
具体实现
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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次方,注意符号位被忽略了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2019-04-10 web.xml中<load-on-start>n</load-on-satrt>作用
2019-04-10 JavaWeb中filter的详解及应用案例
2019-04-10 Tomcat的简单归纳总结
2019-04-10 Tomcat 配置详解和优化
2019-04-10 深入理解Tomcat
2019-04-10 Tomcat启动过程原理详解
2019-04-10 Tomcat的目录结构详细介绍(超全)