2013-04-04 122 views
6

我有這行代碼爪哇位運算

int b1 = 0xffff & (content[12]<<8 | 0xff & content[11]); 

我在小端排序的ByteArray(內容[])和需要重新創建一個2字節值。此代碼工作得很好,但在測試之前我曾經有過這樣寫

int b1 = 0xffff & (content[12]<<8 | content[11]); 

,結果是不正確的。我的問題是爲什麼在這種情況下需要0xff?

+0

因爲字節被解釋爲帶符號整數,這意味着,例如,(字節)0x80得到(int)0xffffff80。這稱爲符號擴展。 – Ingo 2013-04-04 18:26:33

回答

12

0xff是必要的,因爲兩個因素的匯合:

  1. Java中的所有整數類型採取行動之前簽署
  2. 所有位運算符宣傳自己的論點int(或long,如果需要的話)。

其結果是,如果content[11]高階位被設置,它將被符號擴展到負int值。您需要&這與0xff返回到(正)字節值。否則當你|它的結果爲content[12]<<8時,高位字節將全部爲1。

+0

Thx回覆!我不會猜測內容[11]會被轉換爲高位設置的int。我認爲當我將兩個值與OR結合時,他們會在比特級別上使用。乾杯 – John 2013-04-04 18:34:03

+1

@John如果你對這個答案感到滿意(你似乎是這樣),請[接受它](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-工作)。 – 2013-04-05 16:30:55