在Thinking of Java中,有一个会话介绍 Shift操作员说明如下:
“如果你移动一个char,byte或short,它将在移位发生之前被提升为int,结果将是一个int。只有五个低位的将使用右侧。这可以防止你移动超过int中的位数。如果你操作很长时间,你会获得很长的结果。只有六将使用右侧的低位,因此您不能移动超过长的位数。“
我的问题是,char是16位,字节是8位,short是16位,long是64位,但是
1)为什么右侧的五个低位将用于char,byte或short,
2)右侧的六个低位将被用于长时间?
谢谢!
答案 0 :(得分:0)
它说当评估像1 << x
这样的表达式时,只使用x
的低位。 1 << x
相当于1 << (x & 0x1f)
,而1L << x
相当于1L << (x & 0x3f)
。
1)为什么右侧的五个低位将用于char,byte或short,
五位表示你可以将任何距离从0移动到2^5 - 1
= 31.比那更远的移动意味着无论如何都要移过int的末尾。
2)右侧的六个低位将被用于长时间?
六位表示你可以将任何距离从0移动到2^6 - 1
= 63.相比之下的移动意味着无论如何都要移过长尾。
例如:1 << 65 == 2
,因为只使用65的低5位而65是1000001
的二进制,所以低5位只是00001 == 1
和{{1} }。