在Java中,沒有無符號字節這樣的東西。解決所有Java字節都被簽名的最佳方法是什麼?
使用某些低級代碼時,偶爾需要使用無符號值大於128的字節,這會導致Java將它們解釋爲負數,這是由於MSB用於符號。
什麼是解決此問題的好方法? (說不使用Java不是一個選項)
在Java中,沒有無符號字節這樣的東西。解決所有Java字節都被簽名的最佳方法是什麼?
使用某些低級代碼時,偶爾需要使用無符號值大於128的字節,這會導致Java將它們解釋爲負數,這是由於MSB用於符號。
什麼是解決此問題的好方法? (說不使用Java不是一個選項)
當讀取從陣列中的任何一個值將其複製到類似短路或int並手動將負數轉換爲正值。
byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value
在寫入數組時,可以執行類似的轉換。
我想你可以用一個簡短的來存儲它們。效率不是很高,但除了我見過的一些艱鉅的努力之外,它真的是唯一的選擇。
也許你最好的選擇是使用整數而不是字節。它有足夠的空間允許大於128的數字,而不必創建一個特殊的對象來代替字節。
這也被人們認爲比我聰明(大家)
執行位操作/無符號字節的最佳方法是使用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基元。
使用int通常比使用shorts更好,因爲java在內部使用32位值(即使對於字節,除非在數組中),所以使用ints將避免字節碼中不必要的短/長轉換值。
它實際上是有可能擺脫if語句,如果你不喜歡這樣的添加。
byte[] foobar = ..;
int value = (foobar[10] & 0xff);
這樣,Java不會將字節解釋爲負數,並且還會翻轉整數的符號位。
我知道這是一個非常晚的反應,但當我嘗試做同樣的事情時遇到了這個線索。這個問題只是試圖確定一個Java字節是否> 127。
簡單的解決辦法是:
if((val & (byte)0x80) != 0) { ... }
如果真正的問題是> 128,而不是,只是添加另一個條件是,如果語句就可以了。
int value =(foobar [10] &0xFF); – 2009-05-02 07:33:43
可能更容易,更高效,但我希望自己的代碼儘可能清晰和具有啓發性。另外,我不知道「整數在Java中(至少不是沒有使用谷歌搜索),所以我玩了它的安全。 – pauldoo 2009-05-04 10:47:50
爲什麼會和負數做任何不同的事情。它是一個布爾操作它在個別位上工作,它知道,檢查或關心,如果一個數字是正面,負面或任何其他值 – 2011-06-16 02:53:47