gpt4 book ai didi

java - 谁能解释一下这个位操作?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:33 25 4
gpt4 key购买 nike

Decimal         Binary 

x1 = 105 0110 1001
x2 = -38 1101 1010

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

我知道第一个移位会将它向右移位两次,并用 1 替换缺失的位。所以移位的结果是:1111 0110

但我不知道为什么第二次轮类会导致:0011 1111 或 63。

我的理解是 x>> 如果 x 为负则加 1,如果 x 为正则加 0。 >>> 无论符号如何,都会添加一个 0。那么如果是这样的话 x2 >>> 26 的结果不是 0000 0000 吗?

最佳答案

“奇怪”位移结果的原因是因为在位移之前,值被扩大到 32 位 (int)。

我。 e. -38 在这里不是 1101 1010,而是 1111 1111 1111 1111 1111 1111 1101 1010

应该清楚为什么 -38 >>> 260000 0000 0000 0000 0000 0000 0011 1111(或 63)。

Java Language Specification 中描述了加宽:

Otherwise, if the operand is of compile-time type byte, short, or char, it is promoted to a value of type int by a widening primitive conversion (§5.1.2).


如果您想对 8 位 (byte) 值执行移位操作,您可以屏蔽该值以仅使用较低的 8 位,在加宽但在换类之前,就像费德里科建议的那样:

byte x = -38;
(x & 0xFF) >>> 26;

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

关于java - 谁能解释一下这个位操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54810922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com