2014-01-24 93 views
0

任務是從鍵盤讀取一個整數,將其轉換爲8個4位組,然後將每個位轉換爲一個十六進制數並逐一輸出。這必須通過使用位移來完成,而不是其他解決方案。移位練習

我的想法是使用一個帶4個掩碼的掩碼來選擇位組,然後將該組右移,刪除前面的零,並輸出十六進制數。

以下是我試圖接近這一點:

public static void main(String args[]) { 
    Scanner input = new Scanner(System.in); 
    System.out.print("Enter an integer: "); 
    int x = input.nextInt(); 
    System.out.println("Binary representation: " + Integer.toBinaryString(x)); 
    System.out.println("Hexadecimal representatio1n: " + Integer.toHexString(x)); 

    int mask = 15 << 28; 
    System.out.println(Integer.toBinaryString(mask)); 
    int k = 28; 
    for (int i = 1; i <= 8; i++) 
    { 
     int result = mask & x; 
     //System.out.println(Integer.toBinaryString(result)); 
     result = x >>> k ; 
     mask = mask >> 4; 
     k = k - 4; 
     System.out.println(Integer.toHexString(result)); 
    } 
    } 

輸出示例:

Enter an integer: 324234234 
Binary representation: 10011010100110110101111111010 
Hexadecimal representatio1n: 13536bfa 
11110000000000000000000000000000 
1 
13 
135 
1353 
13536 
13536b 
13536bf 
13536bfa 

爲什麼不能正常工作?

謝謝。

回答

0

你當你轉移的結果變量,你是不是被轉移的結果,你用X轉移它

,如果你將其更改爲

result = result >>> k; 

它應該工作

在另一方面,這個問題更容易以其他方式完成(從最低位到最高位) like

int x = 0xaabcdabcd; 
int mask = 0x0fffffff; 
for(int i =0;i < 8; i ++){ 
    System.out.println(x & mask); 
    x = x >>> 4; 
} 
0

因爲沒有無符號類型在Java中,上線int mask = 15 << 28;實際上你通過移動位達簽署場讓你mask負。稍後,您將其左移mask = mask >> 4;,從而帶走標誌位。換班後,您的面具不是00001111000000000000000000000000,而是11111111000000000000000000000000。改爲使用邏輯右移運算符>>>

PS。這看起來像一個家庭作業。在這種情況下,提問的人應該用homework標記標記問題。

+0

[家庭作業標籤已被棄用和刪除。](http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially- depprecated) – Radiodef