java - Java 中的位移位

标签 java bit-manipulation

这是一个 Java 程序,它将 short2 值左移。我有两个问题:

为什么 num << i 值在 16 到 29 之间时会产生有效结果? i 只能保存从 -32,768 到 32,767 的值。

所以我想,也许 shortSystem.out.println 解释为大于 num << i 的值。但是为什么它开始在 short 处产生意外的值呢?

public class LeftShift {

    public static void main(String[] args)
    {
        short num = 2;
        for (int i = 0; i < 32; i++) {
            System.out.println("Left-shifting 2 by " + i + " places yields: " 
                                + (num << i));
        }
    }

}

输出:

Left-shifting 2 by 0 places yields: 2
Left-shifting 2 by 1 places yields: 4
Left-shifting 2 by 2 places yields: 8
Left-shifting 2 by 3 places yields: 16
Left-shifting 2 by 4 places yields: 32
Left-shifting 2 by 5 places yields: 64
Left-shifting 2 by 6 places yields: 128
Left-shifting 2 by 7 places yields: 256
Left-shifting 2 by 8 places yields: 512
Left-shifting 2 by 9 places yields: 1024
Left-shifting 2 by 10 places yields: 2048
Left-shifting 2 by 11 places yields: 4096
Left-shifting 2 by 12 places yields: 8192
Left-shifting 2 by 13 places yields: 16384
Left-shifting 2 by 14 places yields: 32768
Left-shifting 2 by 15 places yields: 65536
Left-shifting 2 by 16 places yields: 131072
Left-shifting 2 by 17 places yields: 262144
Left-shifting 2 by 18 places yields: 524288
Left-shifting 2 by 19 places yields: 1048576
Left-shifting 2 by 20 places yields: 2097152
Left-shifting 2 by 21 places yields: 4194304
Left-shifting 2 by 22 places yields: 8388608
Left-shifting 2 by 23 places yields: 16777216
Left-shifting 2 by 24 places yields: 33554432
Left-shifting 2 by 25 places yields: 67108864
Left-shifting 2 by 26 places yields: 134217728
Left-shifting 2 by 27 places yields: 268435456
Left-shifting 2 by 28 places yields: 536870912
Left-shifting 2 by 29 places yields: 1073741824
Left-shifting 2 by 30 places yields: -2147483648
Left-shifting 2 by 31 places yields: 0

最佳答案

因为 short 上的算术运算会产生 int,除非你将它们强制转换回来。例如,

short value = 2;
short result = value << 31;

给您一个编译错误,您需要将其转换为short

这有几个原因,最值得注意的是

  • 字节码语言并不真正处理任何小于 int 的类型
  • 否则 short 上的操作会更频繁地溢出。
  • 为了更好地模拟大多数硬件,这些硬件通常不会对低于 32 位的值进行操作

关于java - Java 中的位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10799907/

相关文章:

java - 如何通过依赖注入(inject)和垃圾收集来防止循环引用?

java - 写入完成后如何在SFTP中下载文件

java - BigDecimal() 省略前导零

python - 将 XOR 更改为 XNOR

language-agnostic - 什么是按位移位(bit-shift)运算符以及它们如何工作?

c - 文字常量与同值变量左移执行的差异

java - 如何将此字符串 "Mon Jan 01 00:00:00 AEDT 1990"转换为 "1990101"?

java - Android ListView 选择要显示的项目数会导致项目随机排列

java - 移位以获得余数

C++ 负数左移溢出