[英]Unwanted Java bitshift behavior
我正在為我正在做的一些計算生成位掩碼,我需要屏蔽一個int,除了最右邊的x之外的所有都變為零。 我這樣做使用:
int mask = ~(-1 << x);
這適用於x的所有值,除了x = 32.它應該返回-1然后,但它返回0.這里發生了什么?
另外,我試過這個:
int mask = -1 >>> 32 - x;
在x = 0時,它應該返回0,但它返回-1。 以某種方式將某些東西移動32會導致操作返回操作員的左側。 當我嘗試將-1移位33或34位時,它返回一個值,好像它移動了1或2.我是否正確假設Java實際上是這樣做的:
int mask = ~(-1 << x % 32);
和
int mask = -1 >>> (32 - x) % 32;
?
如果是這樣,如果你超過int的32位長度,你為什么要這個循環行為呢? 有關Oracle的文檔明確指出:
無符號右移運算符“>>>”將零移動到最左邊的位置
但顯然,當它必須超過32時,它實際上並不是它正在做的事情......
是的,你是對的; 在應用之前,班次由32(或64, long
s)修改。
如果左側操作數的提升類型是int,則只使用右側操作數的五個最低位作為移位距離。 就好像右手操作數受到按位邏輯AND運算符&(§15.22.1)和掩碼值0x1f(0b11111)的影響。 因此,實際使用的移位距離始終在0到31的范圍內,包括0和31。
如果左側操作數的提升類型很長,則只使用右側操作數的六個最低位作為移位距離。 就好像右手操作數受到按位邏輯AND運算符&(§15.22.1)和掩碼值0x3f(0b111111)的影響。 因此,實際使用的移位距離始終在0到63的范圍內,包括0和63。
至於為什么選擇了Java的這種行為,我不會對你有任何建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.