2013-03-14 20 views
1

我寫了一個函數來打印出一個字節的位。發生這種情況時,將最高有效位設置爲1,將其與輸入字節進行比較,如果它也是1則打印「1」,否則「0」。比較字節然後右移。有符號字節奇偶行爲的位移

如何實現先從10000000且轉移到01000000 00100000然後...

我相信我的問題是推廣造成整數,那麼重鑄,但我沒有看到解決方案。

package errorreporting; 

public class ErrorReporting { 

ErrorReporting() { 
} 

public static void main(String[] args) { 

    ErrorReporting myError = new ErrorReporting(); 
    byte myByte = 16; 
    myError.printByteArray(myByte); 

} 

public void printByteArray(byte inputByte) { 
    // print out 1 or 0 
    byte comparison = -128; 
    for (int x = 0; x < 8; x++) { 
     if ((inputByte & comparison) != 0) { 
      System.out.print("1"); 
     } else { 
      System.out.print("0"); 
     } 
     //  System.out.print(" comparison : " + comparison); 
     comparison = (byte) (comparison >>> 1); 

    } 
    System.out.println(" : " + inputByte); 
} 

}

這個職位有一些信息:Java bitshift strangeness

回答

1

我相信我的問題是推廣爲int然後重鑄

引起的是,它是一個組合一些隱含的和明確的鑄造和符號擴展:

  1. 所有參數都首先晉級到int移位操作發生之前,還看到https://stackoverflow.com/a/3948303/1611055

  2. 由於1,您的簽名移位運算>>>沒有幫助 - 它正確地轉移一個0到最左邊的位置,但由於信源參數-128已在之前被提升爲int ,所以應用該轉換(導致0xffffff80),則在第一班轉換後最終以0x7fffffc0結束。

最簡單的解決方法是使用一個int爲你的面具:

int comparison = 0x80; // -128; 

理論上,你也仍然可以使用面膜一個字節,但你需要明確地將其轉換爲int,同時在應用移位運算符之前丟棄符號位,如下所示:

byte comparison = -128; 
... 
comparison = (byte)((((int) comparison) & 0xff) >>> 1); 

((int) comparison) & 0xff)假定字節應該是「無符號」並將其轉換爲相應的「無符號」整型值。然後,您可以應用移位運算符(>>>>>無關緊要,因爲在任何情況下我們都有一個正數int值)並將其重新轉換爲byte

+0

感謝這工作,我覺得有點煩人,Java做這個自動提升爲int的東西,使明智的運營商行爲不像預期的,我想知道他們爲什麼決定這樣做。 – Zac 2013-03-14 10:26:55