java ->>> 运算符如何在 Java 中工作

标签 java binary bitwise-operators bit-shift

我正在了解 >>> 的工作原理。为此,我有这个程序:

public class Main {
    public static void main(String[] args) 
    {
        short i = 130;
        byte b = (byte)i;
        String a = Integer.toBinaryString(256 + (int) b);
        System.out.println(Integer.toBinaryString(i));
        System.out.println(a.substring(a.length() -8));
        System.out.println(b);

        byte c = (byte) (b >>> 2);
        String x = Integer.toBinaryString(256 + (int) c);

        System.out.println(x.substring(x.length() -8));
        System.out.println(c);
    }
}

我得到了这个输出:

10000010
10000010
-126
11100000
-32

为了显示为二进制,我找到了here如何将字节显示为二进制字符串。

Operator >>> 将添加零,但我明白了:

-126
11100000
-63

代替:

-126
10100000
-32

它正在添加一个 1 而不是 0:

11100000
10100000

我做错了什么?可能我什么都不懂。

最佳答案

问题是 b >>> 2 首先将 b 提升为值为 -126 的 int,即

11111111 11111111 11111111 10000010

当你用零扩展将它右移 2 时,你会得到:

00111111 11111111 11111111 11100000

然后将其转换回字节时,它只是去掉前三个单词,得到 11100000,这就是您所看到的。

参见 section 15.19 JLS 的更多详细信息。

关于java ->>> 运算符如何在 Java 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11526912/

相关文章:

java - While 循环期间主动更新

string - 在 Elixir 中将二进制字符串转换为十六进制,反之亦然

c++ - 是否可以在一个语句中进行 2 个相反的位操作?

ruby - 了解 Ruby 示例中的按位或 '|'

c++ - 有没有一种更快的方法来按位连接两个整数?

c# - 加入是为懒惰的人准备的?

java - 如何在不改变驱动程序或应用程序的位版本的情况下解决使用java Access ms-access时的体系结构差异问题

java - 多个 cron 表达式触发 jenkins 构建

java - 模 32 或 64 约简是什么?

c++ - 为什么这个 bitset 收集算法不起作用?