逻辑右移是否会在Java中添加1?

逻辑右移是否会在Java中添加1?,java,bit-shift,Java,Bit Shift,我有一篇论文用1111111111xxxx作为(简短)(Z>>12)的答案。提供给我们的用于检查位操作答案的程序也为(short)输入提供了此答案。根据我的理解,只有算术移位()是符号敏感的 编辑: Z = -2009 (or 1111100000100111 in binary) (short)(Z>>>12) = -1 (or 1111111111111111 in binary) 据我所知,这可能是个棘手的问题 下面是一个输出给定结果的程序: short z = (

我有一篇论文用
1111111111xxxx
作为
(简短)(Z>>12)
的答案。提供给我们的用于检查位操作答案的程序也为(
short
)输入提供了此答案。根据我的理解,只有算术移位(
)是符号敏感的

编辑:

Z = -2009  (or 1111100000100111 in binary)

(short)(Z>>>12) = -1 (or 1111111111111111 in binary)

据我所知,这可能是个棘手的问题

下面是一个输出给定结果的程序:

short z = (short)0b1111_1000_0010_0111;  // -2009
System.out.println( (short)(z >>> 12) ); // prints -1
这是因为在右移之前,
short
通过符号扩展被提升为
int
。这将用1s填充short范围以上的16位

换句话说:

// as a short
                    1111_1000_0010_0111
// sign extended to int
1111_1111_1111_1111_1111_1000_0010_0111
// shifted right 12
0000_0000_0000_1111_1111_1111_1111_1111
// cast back to short
                    1111_1111_1111_1111
如果您不想要符号扩展,则必须屏蔽:

System.out.println( (short)((z & 0xffff) >>> 12) );

Java中的数学运算符从不在
char
byte
short
上操作,它们总是先隐式提升为
int

这取决于你的z值,你加1是什么意思?请提供一个例子。这解释了它,谢谢!这有点棘手,需要您知道java将short提升为int。我必须移动17次或屏蔽才能看到0。