Java右移每32位(64位)循环

        long a = 33;
        for (int i = 0; i < 64; i++) {
            System.out.println(i + " " + (a >> i));
        }

结果:

0 33
1 16
2 8
3 4
4 2
5 1
6 0
7 0
...
62 0
63 0

而如果是int, short, byte:

        int a = 33; // short, byte 也一样
        for (int i = 0; i < 64; i++) { // i 为 short, byte也一样
            System.out.println(i + " " + (a >> i));
        }

结果是:

0 33
1 16
2 8
3 4
4 2
5 1
6 0
7 0
...
30 0
31 0
32 33
33 16
34 8
35 4
36 2
37 1
38 0
39 0
40 0
41 0
...
62 0
63 0
  • 为何出现这样的情况?

  • 猜测是机器码只会截取低8bit/4bit作为移位量。(需反编译,待续)

  • 为何int short boolean和long不一样?

  • Java运算时默认将操作数扩展为int(long位数大于int所以不会变化),所以int,short,boolean结果都是32位一次循环。

版权所有,转载请注明出处:
https://sickworm.com/?p=486