我有一個項目中的幾行代碼,我看不到的價值...按位與,按位或問題,在Java
buffer[i] = (currentByte & 0x7F) | (currentByte & 0x80);
它讀取從該filebuffer文件,以字節形式存儲,然後如圖所示傳輸到緩衝區[i],但我無法理解總體目的是什麼,有什麼想法?
謝謝
我有一個項目中的幾行代碼,我看不到的價值...按位與,按位或問題,在Java
buffer[i] = (currentByte & 0x7F) | (currentByte & 0x80);
它讀取從該filebuffer文件,以字節形式存儲,然後如圖所示傳輸到緩衝區[i],但我無法理解總體目的是什麼,有什麼想法?
謝謝
至於其他的答案已經指出,(currentByte & 0x7F) | (currentByte & 0x80)
相當於(currentByte & 0xFF)
。該JLS3 15.22.1說,這是提升到int
:
當操作員&,兩個操作數 ^或| (§5.6.2)是一種類型是 轉換(§5.1.8)到原始 積分型的,二進制數字 促進首先在 操作數執行。 按位運算符表達式的類型是操作數的升級類型 。
因爲JLS3 5.6.2說,當currentByte
具有類型byte
和0x7F
爲int
(和是這種情況),那麼兩個操作數都提升到int
。
因此,buffer
將元素類型int
或更寬的陣列。
現在,通過在執行int
& 0xFF
,我們有效原始byte
範圍-128..127映射到無符號範圍0..255,經常使用例如java.io
流的操作。
您可以在下面的代碼片段在行動中看到這一點。請注意,要理解此處發生的情況,您必須知道Java存儲的整數類型(除char
之外)爲2's complement值。
byte b = -123;
int r = b;
System.out.println(r + "= " + Integer.toBinaryString(r));
int r2 = b & 0xFF;
System.out.println(r2 + "= " + Integer.toBinaryString(r2));
最後,對於一個真實的例子,檢查出read
方法java.io.ByteArrayInputStream
的Javadoc和執行:
/**
* Reads the next byte of data from this input stream. The value
* byte is returned as an <code>int</code> in the range
* <code>0</code> to <code>255</code>. If no byte is available
* because the end of the stream has been reached, the value
* <code>-1</code> is returned.
*/
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
我覺得有人在這裏做了太多的想法。這是不對的。
,我只有一句話
它的代碼留下。除非你知道你在腥蠢的運行時間?無論如何,'緩衝區'的類型是什麼?
的複雜逐位邏輯完全是多餘的。
for (int i = 0; i < buffer.length; i++) {
buffer[i] = filebuffer[currentPosition + i] & 0xff;
}
做同樣的事情。如果緩衝區被聲明爲一個字節數組,你甚至可以離開了& 0xFF的,但遺憾的是沒有顯示的聲明。
的原因可能是,原開發商是由字節迷糊中的Java簽字。
(currentByte & 0x7F) | (currentByte & 0x80)
相當於
currentByte & (0x7F | 0x80)
相當於
currentByte & 0xFF
這是完全一樣的
currentByte
編輯:我只能看着的右側轉讓,我仍然認爲e quivalance是真實的。
然而,這似乎是代碼希望將符號字節轉換爲更大的類型,而解釋字節爲無符號。
有沒有簽訂字節轉換爲無符號在Java更簡單的方法?
位與操作的結果,對一個1比特,其中這兩個位都爲1,而對按位或運算HASE一個的結果位,其中任一機器人位中的一個是1。
因此,一個該值0x65例如評價:
01100101 0x65
& 01111111 0x7F
===============
01100101 0x65
01100101 0x65
& 10000000 0x80
===============
00000000 0x00
01100101 0x65
| 00000000 0x00
===============
01100101 0x65
關於這種類型的邏輯運算的好處:你可以想盡可能的組合(全部256個)並驗證您是否得到了您期望的答案。
原來,該字節正在讀取的文件是帶符號位表示法,但長度不同,因此需要執行此任務才能將其擴展爲java int類型,而保留其正確的標誌:)
大聲笑,這是我必須與之合作! :) – Dave 2009-02-18 13:03:12
兩者都是陣列OS字節 我試圖建議從廷博,其fubared改變時: -/ – Dave 2009-02-18 13:09:26
緩衝器元件int類型或更寬的,否則不應該編譯。 – eljenso 2009-02-18 13:19:25