Java 使用右移运算符屏蔽标志扩展>&燃气轮机;

Java 使用右移运算符屏蔽标志扩展>&燃气轮机;,java,Java,我目前正在学习位运算符,在《Java完整参考第九版》一书中遇到了以下示例 我理解右移运算符>>的作用,但我不确定这个示例实际上是如何工作的(也许我不理解>>到底是如何工作的)。有人能给我解释一下吗 有时,在需要时不希望对扩展值进行签名 把它们移到右边。例如,下面的程序 将字节值转换为其十六进制字符串表示形式。通知 通过将移位值与0x0f求和以丢弃任何 对扩展位进行签名,以便将该值用作 十六进制字符数组 左移位4保留原始数字的符号 但是((字节)0xf1)>>4是-1,这不是您想要的 您只需要较低

我目前正在学习位运算符,在《Java完整参考第九版》一书中遇到了以下示例

我理解右移运算符>>的作用,但我不确定这个示例实际上是如何工作的(也许我不理解>>到底是如何工作的)。有人能给我解释一下吗

有时,在需要时不希望对扩展值进行签名 把它们移到右边。例如,下面的程序 将字节值转换为其十六进制字符串表示形式。通知 通过将移位值与0x0f求和以丢弃任何 对扩展位进行签名,以便将该值用作 十六进制字符数组


左移位4保留原始数字的符号

但是((字节)0xf1)>>4是-1,这不是您想要的


您只需要较低的4位,而
&0x0f
仅提供较低的4位。这将为您提供
0xf
,它是最上面的4位或15位。

有符号左移4保留原始数字的符号

但是((字节)0xf1)>>4是-1,这不是您想要的


您只需要较低的4位,而
&0x0f
仅提供较低的4位。这将为您提供顶部4位或15位的
0xf

在您的示例中,b设置为0xf1(11110001)。B>>4导致:11111111

因为Java使用算术移位,所以在执行右移之后,最左边的数字将是1(不像逻辑移位那样,逻辑移位会在末尾留下一个零)


要解决此问题,请执行11111111&0x0f(000011111),结果为000011111。

在示例中,b设置为0xf1(11110001)。B>>4导致:11111111

因为Java使用算术移位,所以在执行右移之后,最左边的数字将是1(不像逻辑移位那样,逻辑移位会在末尾留下一个零)


要解决此问题,请执行11111111&0x0f(000011111),结果为000011111。

在开始解释之前,如果您了解二进制、十进制和十六进制系统,了解这一点会很有帮助吗?如果你知道如何在这三个系统之间转换数字,那么解释就容易多了^^^@MeinName我确实理解不同编号系统之间的差异。我可以在它们之间做一些基本的转换,需要一定的时间和思考:)在开始解释之前,如果你知道二进制、十进制和十六进制的知识,那会很有帮助吗?如果你知道如何在这三个系统之间转换数字,那么解释就容易多了^^^@MeinName我确实理解不同编号系统之间的差异。我可以在它们之间进行基本转换,但需要一定的时间和思考:)为什么(0xf1>>4)应该是-1?应该是15岁吧?编辑:哦,因为它是一个字节^^@MeinName<代码>(0x000000f1>>4)为15。但是
((字节)0xf1)>>4)
(0xfffff1>>4)
或-1@PeterLawrey谢谢你的解释。这件小事太令人困惑了。关于这个话题,你有什么好的阅读建议吗?再次感谢你的帮助@TonyStark我建议玩操作,用十六进制打印每个操作的内容。我早在上网之前就学会了这些东西,所以我不知道哪一个好(除了使用谷歌)。为什么(0xf1>>4)应该是-1?应该是15岁吧?编辑:哦,因为它是一个字节^^@MeinName<代码>(0x000000f1>>4)为15。但是
((字节)0xf1)>>4)
(0xfffff1>>4)
或-1@PeterLawrey谢谢你的解释。这件小事太令人困惑了。关于这个话题,你有什么好的阅读建议吗?再次感谢你的帮助@TonyStark我建议玩操作,用十六进制打印每个操作的内容。我在上网之前很久就学会了这些东西,所以我不知道哪一个好(除了使用谷歌)。
// Masking sign extension.

class HexByte {

    static public void main(String args[]) {
        char hex[] = {
            '0', '1', '2', '3', '4', '5', '6', '7',
            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
        };
        byte b = (byte) 0xf1;
        System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
    }
}