簡體   English   中英

不需要的Java bitshift行為

[英]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)修改。

JLS 15.19

如果左側操作數的提升類型是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM