Java 有人能解释一下这一点吗?

Java 有人能解释一下这一点吗?,java,bit,bit-shift,Java,Bit,Bit Shift,我知道第一个移位将向右移位两次,并用1替换丢失的位。因此,这种转变导致: 11110110 但我不知道为什么第二次换班会导致: 0011111或63 我的理解是,如果x为负,x>>加1,如果x为正,则加0。>>>添加0,而不考虑符号。因此,如果是这种情况,x2>>>26的结果不是0000 0000吗?产生“奇怪”位移位结果的原因是移位前值被加宽到32位(int) 即-38在这里不是1101010,而是1111111111111111111111111101010 这应该说明为什么-38>>26是

我知道第一个移位将向右移位两次,并用1替换丢失的位。因此,这种转变导致: 11110110

但我不知道为什么第二次换班会导致: 0011111或63

我的理解是,如果x为负,x>>加1,如果x为正,则加0。>>>添加0,而不考虑符号。因此,如果是这种情况,x2>>>26的结果不是0000 0000吗?

产生“奇怪”位移位结果的原因是移位前值被加宽到32位(
int

即<代码>-38在这里不是
1101010
,而是
1111111111111111111111111101010

这应该说明为什么
-38>>26
0000 0000 0011111
(或者
63

加宽部分在以下章节中进行了说明:

否则,如果操作数是编译时类型
byte
short
char
,则通过扩大原语转换(§5.1.2)将其提升为
int
类型的值


如果要对8位(
字节
)值执行位移位操作,可以在加宽后但移位前屏蔽该值以仅使用较低的8位,如Federico建议的:

Decimal         Binary 

x1 = 105        0110 1001
x2 = -38        1101 1010  

1. (byte) (x>>2) 
2. (byte) (x>>>26)

这将给出预期值0(尽管我不确定它是否有意义,因为如果右移超过8位,任何8位值都将是0)。

(byte)(x>>26)
首先移位,然后强制转换为
byte
。是什么类型的
x
?我打赌它比8位宽。可能会有帮助。正如@FedericoklezCulloca所说;您可能希望尝试使用int来保持正确的值。当我第一次开始尝试位移位时,我发现即使在尝试编写高性能网络时,转换变量也很棘手。好的,请修复您的示例(包括
x1
x2
的类型,并在移位中放置正确的东西,而不是
x
。我认为类型无关紧要,因为值被扩大到32位(
int
)无论如何,在换班之前。也就是说,-38在这里不是
1101010
,而是
1111111111111111111111111111111101101010
。这应该说明为什么
-38>>26
0000 0000 0011111
(63)。既然你要编辑你的问题,你能提供一个(也就是说,一个显示你的问题所在的小程序)。如果
x
字节
,你可能会想要
(x&0xFF)>>26
,但如果这是目标,它会使结果为0。对不起,我被
F
s迷住了。无论如何,是的,我认为这就是他们试图实现的。通过“解决问题”我的意思是“给出预期的结果”。谢谢大家!这不是一个简单的程序,更多的是使用位运算符的练习。为什么-38表示为1111111111111111111111101010@haraldK@blondiefunk69如果这确实是一个练习,我会让你自己去弄清楚。不过这里有一些建议阅读:。;-)
byte x = -38;
(x & 0xFF) >>> 26;