2008-08-14 37 views
53

在Java中,沒有無符號字節這樣的東西。解決所有Java字節都被簽名的最佳方法是什麼?

使用某些低級代碼時,偶爾需要使用無符號值大於128的字節,這會導致Java將它們解釋爲負數,這是由於MSB用於符號。

什麼是解決此問題的好方法? (說不使用Java不是一個選項)

回答

18

當讀取從陣列中的任何一個值將其複製到類似短路或int並手動將負數轉換爲正值。

byte[] foobar = ..; 
int value = foobar[10]; 
if (value < 0) value += 256 // Patch up the 'falsely' negative value 

在寫入數組時,可以執行類似的轉換。

+46

int value =(foobar [10] &0xFF); – 2009-05-02 07:33:43

+8

可能更容易,更高效,但我希望自己的代碼儘可能清晰和具有啓發性。另外,我不知道「整數在Java中(至少不是沒有使用谷歌搜索),所以我玩了它的安全。 – pauldoo 2009-05-04 10:47:50

+1

爲什麼會和負數做任何不同的事情。它是一個布爾操作它在個別位上工作,它知道,檢查或關心,如果一個數字是正面,負面或任何其他值 – 2011-06-16 02:53:47

-1

我想你可以用一個簡短的來存儲它們。效率不是很高,但除了我見過的一些艱鉅的努力之外,它真的是唯一的選擇。

0

執行位操作/無符號字節的最佳方法是使用int s。即使它們已被簽名,它們仍有足夠的空餘位(共32個)作爲無符號字節處理。此外,所有的數學運算符都會將較小的固定精度數字轉換爲int。例如:

short a = 1s; 
short b = 2s; 
int c = a + b; // the result is up-converted 
short small = (short)c; // must cast to get it back to short 

因爲這是最好還是堅持整數和掩蓋它讓你感興趣的位例:

int a = 32; 
int b = 128; 
int foo = (a + b) | 255; 

下面是Java原始一些更多的信息類型http://mindprod.com/jgloss/primitive.html

最後一個小問題,Java中有一個無符號的固定精度數字。這是char基元。

1

使用int通常比使用shorts更好,因爲java在內部使用32位值(即使對於字節,除非在數組中),所以使用ints將避免字節碼中不必要的短/長轉換值。

77

@pauldoo

它實際上是有可能擺脫if語句,如果你不喜歡這樣的添加。

byte[] foobar = ..; 
int value = (foobar[10] & 0xff); 

這樣,Java不會將字節解釋爲負數,並且還會翻轉整數的符號位。

0

我知道這是一個非常晚的反應,但當我嘗試做同樣的事情時遇到了這個線索。這個問題只是試圖確定一個Java字節是否> 127。

簡單的解決辦法是:

if((val & (byte)0x80) != 0) { ... } 

如果真正的問題是> 128,而不是,只是添加另一個條件是,如果語句就可以了。

相關問題