【问题标题】:Perform bitwise OR without sign extension in Java在 Java 中执行不带符号扩展的按位或
【发布时间】:2017-01-29 13:09:16
【问题描述】:

在 Java 中,我有以下代码:

    byte lo = 0x88;
    byte hi = 0x0;
    short x = 0;
    x |= lo;
    x |= (short) ((short) hi << 8); // FIXME double cast ??
    return x;

第一次操作后,short 中的值为0xff88。我理解这是因为 Java 不支持无符号数。

如何强制它忽略该标志?我没有直接在 Java 代码中使用这些数据,所以没关系,对吧?

【问题讨论】:

  • byte lo = 0x88; 无法编译,其值超出了byte 表示的数字范围。
  • @AR.3 我想知道如何避开这个标志。
  • 您当前的代码无法编译。您能否提供一个完整的工作示例?

标签: java unsigned


【解决方案1】:

在执行按位运算之前将字节转换为 int 时出现符号。转换必须符号扩展 byte 值,因为 byte 是 Java 中的符号类型。必须进行转换,因为按位运算要么是对 int 值的运算,要么是对 long 值的运算。

有两种解决方案:

  1. 在转换为int 之后或执行按位或之后屏蔽最高位;例如

    x |= (lo & 0xff);
    x |= (hi & 0xff) << 8;
    

    (事实证明,hi 不需要屏蔽...因为您稍后会执行此操作。但是,JIT 编译器有可能会优化掉任何不必要的屏蔽指令。如果没有,开销是如此之小以至于它不太重要。)

  2. 使用Byte.toUnsignedInt(byte)byte 转换为int

【讨论】:

  • 感谢您的帮助。这解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多