首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么右移运算符生成的是0而不是1?

为什么右移运算符生成的是0而不是1?
EN

Stack Overflow用户
提问于 2010-06-10 00:35:16
回答 6查看 4.3K关注 0票数 3

我正在自学Java,并完成了用java思考的练习。

在第116页的练习11中,你应该右移一个整数的所有二进制位置,并用Integer.toBinaryString显示每个位置。

代码语言:javascript
复制
public static void main(String[] args) {
int i = 8;
System.out.println(Integer.toBinaryString(i));
int maxIterations = Integer.toBinaryString(i).length();
int j;
for (j = 1; j < maxIterations; j++) {
    i >>= 1;
System.out.println(Integer.toBinaryString(i));
}

在解决方案指南中,输出如下所示:

代码语言:javascript
复制
1000
1100
1110
1111

当我运行这段代码时,我得到了这样的结果:

代码语言:javascript
复制
1000
100
10
1

这是怎么回事。数字被截断了吗?

我使用的是64位jdk1.6.0_20。这本书使用的是jdk1.5 32位。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-10 00:38:10

看来这本书里有个错误。

右移位操作将所有位向右移位,删除最低有效位。如果您将结果正确对齐(例如,通过用零填充),这会更有意义。

代码语言:javascript
复制
00001000
00000100
00000010
00000001
00000000

移入的最高位是:

如果你的数字是正数,

  • 0;如果你的数字是负数,
  • 1。

如果您希望最终结果为1,则尝试使用负数,如-8而不是8。

代码语言:javascript
复制
11111111111111111111111111111000
11111111111111111111111111111100
11111111111111111111111111111110
11111111111111111111111111111111

如果使用>>>而不是>>,则无论数字是正数还是负数,都将始终移入零。

票数 10
EN

Stack Overflow用户

发布于 2010-06-10 00:39:05

当给定一个正整数作为输入时,右移位操作符最终会产生一个零,这是正确的。

最好将其视为这样一种操作,即所有数字都向右移位,最右侧的数字被截断,并在左侧添加额外的零,即模式为:

代码语言:javascript
复制
00001000
00000100
00000010
00000001
00000000
00000000
票数 3
EN

Stack Overflow用户

发布于 2010-06-10 00:40:23

来自按位运算符Java Tutorials Page

无符号右移位操作符">>>“将一个零移到最左边的位置,而">>”之后的最左边的位置取决于符号扩展。

因为8是正的,所以零被移位了。如果i为负,则会将1移位(以保持整数上的符号不变)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3007860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档