java - 为什么在对结果求和之前需要左移?
问题描述
这是一个按预期工作的代码片段,它正确地反转整数的位并返回新的 int。我的问题是为什么result <<= 1
在我将结果与操作相加之前必须出现这条线n&1
?
在第一次迭代中,它不会影响结果,因为结果被实例化为 0。如果我将这result <<= 1
一行放在 for 循环的 END 处,在将结果与 求和之前,我仍然会左移结果n&1
。我的代码,最后是左移结果,不起作用,我似乎无法理解这最后一步。
public int reverseBits(int n) {
int result = 0;
for(int i=0; i<32; i++){
result <<= 1;
result += n&1;
n >>= 1;
}
return result;
}
解决方案
在第一次迭代中,它确实没有任何效果,但没关系,这是有意的。这比写作要好if (i != 0) result <<= 1;
。在每次迭代中检查这一点是低效的。但同样重要的是要注意这一点,基本上在 32 次迭代中只有在 31 次才会产生效果并且应该。因此,如果你把这result <<= 1;
行放在最后,而不是确保它只有效执行 31 次,还要记住,现在它应该在顺序更改后的第一次迭代中执行,但不应该在最后一次迭代中执行。这就是结果无效的原因。
尝试这个。这将起作用。
public int reverseBits(int n) {
int result = 0;
for(int i=0; i<32; i++){
result += n&1;
n >>= 1;
if (i != 31) // skip the shift in last iteration
result <<= 1;
}
return result;
}
推荐阅读
- java - 向 hashCode() 添加数字是为了什么?
- assembly - 有人可以确认 push r64 应该是 50+ro 而不是 +rd 吗?英特尔文档中的错误?
- firebase - 通过“createCustomToken”方法发布时,CustomToken 不起作用
- c# - 新的 Microsoft.NET.Sdk 项目在子目录中构建输出文件。怎么改回来?
- javascript - 使用 AAD 访问 .Net Web Api 的 JQuery 抛出 401 invalid_token / 发行者无效
- css - HTML / SASS 元素的属性值无效
- sql - 如何限制 DBeaver 数据编辑器以限制结果集大小?
- sql-server - SQL 删除并取回字段
- javascript - "找到) 当期望 (" Java 脚本
- angular - 如何重写谷歌地理图表的代码以将其与角度(angular-google-charts)一起使用?