2016-10-05 77 views
0

我目前正在学习按位运算符,并且在“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]); 
    } 
} 
+1

开始解释这将是有益的知道,如果你有二进制,十进制和十六进制的知识之前?如果你知道如何在这三个系统之间转换数字,解释要容易得多^^ –

+0

@MeinName我明白不同编号系统之间的区别。我可以在它们之间做一些基本的转换,但有一定的时间和思考:) – Thor

回答

3

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

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

你只需要低4位,这是& 0x0f给你的低4位。这给你0xf这是最高的4位或15。

+2

为什么要(0xf1 >> 4)是-1?难道不是15? 编辑:哦,因为它是一个字节^^ –

+2

@MeinName它是。 '(0x000000f1 >> 4)'是15.但是((字节)0xf1)>> 4)'是'(0xfffffff1 >> 4)'或-1 –

+0

@PeterLawrey谢谢你的解释。这件事情很混乱。你对这个话题有什么好的阅读建议吗?再次感谢你的帮助! – Thor

1

在你的例子中b被设置为0xf1(11110001)。 B >> 4周的结果在这样的:11111111

由于Java使用算术移位,执行右移之后,最左边的数字将是1(不同于逻辑移位 whhich将在端留下一个零) 。

要解决这个问题,你执行11111111 &为0x0F(00001111),其结果00001111.