2012-10-02 89 views
2

我正在處理從CCS轉換浮點數,它不符合IEEE標準(而不是符號位,指數,尾數,它們使用指數,符號位,Mantissa);我遇到了一些使用>>>運算符的奇怪行爲。正確的邏輯/無符號移位插入1而不是0符號位

給出

byte byte1=(byte)0x8A;  //10001010 
byte byte2=(byte)(byte1>>>1);  //11000101 

由於>>>指定它將插入0,爲什麼我得到一個1

我可以對此進行編碼,只需手動翻轉一下,但我不想發現它是特定於平臺的。

+0

在數字前加'0x'告訴JVM它是一個十六進制值(在這個例子中是0x8A),比Byte.decode簡單:)編輯:事實上,Byte.decode不起作用有... –

+0

@亞歷山大科爾曼真實,並且很好。在這種情況下,我實際上並沒有這樣做,只是將它用於示例的目的。我收到的REAL'Byte'已經有'8A'了。謝謝。 – Sheriff

+0

你必須投到字節(這是一個int);)但是好的 –

回答

2

在java中,字節被轉換爲整數的移位之前自動對他們進行操作。在編碼上,你在做什麼等價於:

byte byte2=(byte)(((int)byte1)>>>1); 

而且,當然,轉換爲int符號擴展。如果將結果保留爲整數,則會看到0x7FFFFFC5的(當時)期望值。

爲了解決這個問題,只需要掩蓋第8個位。

byte byte2 = (byte) (byte1 >>> 1 & 0x7F); 

Related question

這不是明智的行爲和預期,而不是Java的偉大?

0

您使用的是整數,而不是字節。 int的值必須比您要移入的第8位高出1位。

+0

完全刪除了'int',所有'byte's。仍然是相同的結果。無論如何,bitshift似乎都會返回一個「int」,所以我不得不將其轉換爲「byte」。 – Sheriff

1

不要使用字節,請使用int。但是,運行下面的代碼:

int int1 = 0x8A; 
    System.out.println(formatBinary(int1)); 
    int int2 = int1 >>> 1; 
    System.out.println(formatBinary(int2)); 

讓我這個輸出(與被叫formatBinary格式化打印方法,它是不相關的):

8a: 10001010 
45: 01000101 
相關問題