2009-02-18 72 views
10

我有一個項目中的幾行代碼,我看不到的價值...按位與,按位或問題,在Java

buffer[i] = (currentByte & 0x7F) | (currentByte & 0x80); 

它讀取從該filebuffer文件,以字節形式存儲,然後如圖所示傳輸到緩衝區[i],但我無法理解總體目的是什麼,有什麼想法?

謝謝

回答

9

至於其他的答案已經指出,(currentByte & 0x7F) | (currentByte & 0x80)相當於(currentByte & 0xFF)。該JLS3 15.22.1說,這是提升到int

當操作員&,兩個操作數 ^或| (§5.6.2)是一種類型是 轉換(§5.1.8)到原始 積分型的,二進制數字 促進首先在 操作數執行。 按位運算符表達式的類型是操作數的升級類型 。

因爲JLS3 5.6.2說,當currentByte具有類型byte0x7Fint(和是這種情況),那麼兩個操作數都提升到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; 
} 
3

我覺得有人在這裏做了太多的想法。這是不對的。

,我只有一句話

  • 原作者擔心運行時與本地符號整數(大概32位)替換字節,並明確地試圖告訴我們有關的標誌的東西有點「特殊」?

它的代碼留下。除非你知道你在腥蠢的運行時間?無論如何,'緩衝區'的類型是什麼?

+0

大聲笑,這是我必須與之合作! :) – Dave 2009-02-18 13:03:12

+0

兩者都是陣列OS字節 我試圖建議從廷博,其fubared改變時: -/ – Dave 2009-02-18 13:09:26

+0

緩衝器元件int類型或更寬的,否則不應該編譯。 – eljenso 2009-02-18 13:19:25

2

的複雜逐位邏輯完全是多餘的。

for (int i = 0; i < buffer.length; i++) { 
    buffer[i] = filebuffer[currentPosition + i] & 0xff; 
} 

做同樣的事情。如果緩衝區被聲明爲一個字節數組,你甚至可以離開了& 0xFF的,但遺憾的是沒有顯示的聲明。

的原因可能是,原開發商是由字節迷糊中的Java簽字。

4
(currentByte & 0x7F) | (currentByte & 0x80) 

相當於

currentByte & (0x7F | 0x80) 

相當於

currentByte & 0xFF 

這是完全一樣的

currentByte 

編輯:我只能看着的右側轉讓,我仍然認爲e quivalance是真實的。

然而,這似乎是代碼希望將符號字節轉換爲更大的類型,而解釋字節爲無符號。

有沒有簽訂字節轉換爲無符號在Java更簡單的方法?

2

位與操作的結果,對一個1比特,其中這兩個位都爲1,而對按位或運算HASE一個的結果位,其中任一機器人位中的一個是1。

因此,一個該值0x65例如評價:

01100101 0x65 
& 01111111 0x7F 
=============== 
    01100101 0x65 

    01100101 0x65 
& 10000000 0x80 
=============== 
    00000000 0x00 

    01100101 0x65 
| 00000000 0x00 
=============== 
    01100101 0x65 
0

關於這種類型的邏輯運算的好處:你可以想盡可能的組合(全部256個)並驗證您是否得到了您期望的答案。

0

原來,該字節正在讀取的文件是帶符號位表示法,但長度不同,因此需要執行此任務才能將其擴展爲java int類型,而保留其正確的標誌:)