我目前正在学习按位运算符,并在书中遇到了以下示例" 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]);
}
}
答案 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。