【问题标题】:Could anybody explain this bit operations?有人可以解释一下这个位操作吗?
【发布时间】:2019-02-21 15:41:49
【问题描述】:
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 吗?

【问题讨论】:

  • (byte) (x>>>26) 首先转换,然后转换为 bytex 是什么类型的?我敢打赌它比 8 位更宽。
  • 可能会有所帮助。 Bitwise Tutorial 正如@FedericoklezCulloca 所说;您可能想尝试使用 int 来保存正确的值。当我第一次开始尝试位移时,我发现即使在尝试编写高性能网络时,强制转换变量也很棘手..
  • 好的,请修正您的示例(包括 x1x2 的类型,并在班次中放置正确的东西而不是 x
  • 我认为类型无关紧要,因为无论如何在移位之前值已扩大到 32 位 (int)。 IE。 -38 在这里不是1101 1010,而是1111 1111 1111 1111 1111 1111 1101 1010。这应该清楚为什么-38 >>> 260000 0000 0000 0000 0000 0000 0011 1111 (63)。
  • 既然您无论如何都会编辑您的问题,您能否提供一个Minimal, Complete, and Verifiable Example(即显示您的问题所在的小程序)。

标签: java bit bit-shift


【解决方案1】:

“奇怪”位移结果的原因是因为值在位移之前加宽到 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中描述:

否则,如果操作数的编译时类型为 byteshortchar,则通过扩展原语转换(第 5.1.2 节)将其提升为 int 类型的值。


如果您想对 8 位 (byte) 值执行位移操作,您可以屏蔽该值以仅使用低 8 位,在扩展之后但在移位之前,例如 Federico建议:

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

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

【讨论】:

  • 如果xbyte,您可能会想要(x & 0xFF) >>> 26,但是如果这是目标,它会使结果为0。
  • 对不起,我被Fs 带走了。无论如何,是的,我认为这就是他们想要实现的目标。我所说的“解决问题”是指“给出预期的结果”。
  • 谢谢大家!每个人说这不是一个程序,它更多的是使用位运算符的练习。为什么 -38 表示为 1111 1111 1111 1111 1111 1111 1101 1010?@haraldK
  • @blondiefunk69 如果这确实是一个练习,我会留给你来解决这个问题。不过,这里有一些建议阅读:Two's complenent。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多