使用右移运算符掩蔽符号扩展>>

时间:2016-10-05 06:59:03

标签: java

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

我理解右移运营商>>确实如此,但我并不完全确定这个例子是如何运作的(也许我不明白>>毕竟是如何工作的)。有人可以向我解释一下吗?

  

有时候你不希望签署扩展值   将它们转移到右边。例如,以下程序   将字节值转换为其十六进制字符串表示形式。注意   通过与0x0f进行AND运算来屏蔽移位值以丢弃任何值   符号扩展位,以便该值可以用作索引   十六进制字符数组。

// 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]);
    }
}

2 个答案:

答案 0 :(得分:3)

签名左移4保持原始数字的符号。

然而((字节)0xf1)>> 4是-1,这不是你想要的。

你只需要低4位,& 0x0f只给出低4位。这会给你0xf这是前4位或15。

答案 1 :(得分:1)

在您的示例中,b设置为0xf1(11110001)。 B>> 4结果如下:11111111。

因为Java正在使用算术移位,所以在执行右移后,最左边的数字将为1(与逻辑移位不同,最后会留下零)。

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