2012-10-11 19 views
4

這是一個非常基本的問題,但我從來沒有完全說服我自己,我的「沒有區別」直觀的答案是正確的,所以也許有人有一個好辦法,明白這一點:對於Java中的按位運算,我是否需要關心Java中的大多數數字類型是否被簽名?

如果我想要的在Java中使用其中一種基本數字類型是按位算術,我可以簡單地將它看作是無符號值還是需要避免負數,即將最高位始終設置爲0?例如,我可以使用int,就好像它是一個無符號的32位數字,或者我應該只使用最低的31位?

我在尋找一般答案儘可能,但讓我舉個例子:比方說,我想存儲32個標誌。我可以將它們都在單個int,如果我使用類似

store = store & ~(1 << index) | (value << index) 

設置標誌indexvalue和類似

return (store & (1 << index)) != 0 

檢索標誌index?或者,如果我將index設置爲1來標記此代碼或類似代碼,我是否會遇到任何問題?

我知道我需要總是使用>>>而不是>>來進行右移,但這是唯一的擔憂嗎?或者當我使用最高位時,是否會出現與負數的二進制補碼錶示相關的其他問題?

回答

2

在這種情況下也有合法的理由使用>>(一種常見情況是當直接製作掩碼時應該是0或-1,而不必取消掩碼爲0或1),所以存在真的不用擔心。只是要小心你在做什麼,以確保它符合你的意圖。該關心的符號性

操作(即他們與不同的語義不同的符號和無符號的形式)是:

  • 右移
  • 師(無符號的形式在Java中不可用)
  • 模(無符號形成在Java中不可用)
  • 比較(除平等)(未簽名的形式在Java中不可用)

不關心的符號性的操作有:

  • XOR
  • 此外
  • 減法
  • 補否定(-x意味着~x + 1
  • 的補(~x表示-x - 1
  • 左移
  • 乘法
+0

感謝您的好評。 –

3

我知道我需要總是使用>>>而不是>>右移,但這是唯一的擔憂嗎?

是的,這是唯一的問題。左移左右在簽名和未簽名的數字上工作相同; AND ing,OR ing和XOR也是如此。只要您使用>>>進行右移,就可以使用簽名爲int的所有32位。

+0

+1。一種有用的思考方式OP是,如果符號位被打開,一個無符號數字會上升2^31,而一個有符號數字會下降2^31。這是唯一的區別。 –

相關問題