2012-05-24 31 views
4

我一直以緊湊存儲有關對象的信息玩弄位操作,我打算做的是有一個short[][]存儲的兩條信息每個條目,即第一組比特(8或4)包含信息,然後其餘比特(分別爲8或12)存儲剩餘的比特。爪哇 - 位運算困惑我,它的工作原理,但我認爲它不應該

在下面的代碼中,我演示了我提到的兩個示例,即將提出的問題;

private void test1() { 
    // This test takes a 16 bit binary number and breaks it into two 
    // bytes of 8 bits. It then takes the bytes and sticks them back 
    // together then outputs their decimal value 
    String st = "0011111100110111"; 
    short s = Short.parseShort(st,2); 
    byte[] ba = new byte[] { 
     (byte)(s & 0xFF), 
     (byte)((s >>> 8) & 0xFF) 
     }; 

    System.out.println(s); 
    System.out.println(ba[0]); 
    System.out.println(ba[1]); 

    byte b0 = ba[0]; 
    byte b1 = ba[1]; 

    short sh = (short)((b1 << 8) | b0); 

    System.out.println(sh); 
} 

private void test2() { 
    // This test takes two shorts and sticks them together in a 
    // 4 bit 12 bit configuration within a short, it then breaks 
    // them apart again to see if it worked! 
    short s0 = 4095; 
    short s1 = 15; 

    short sh = (short)((s1 << 12) | s0); 

    System.out.println(sh); 

    short[] sa = new short[] { 
     (short)(sh & 0xFFF), 
     (short)((sh >>> 12) & 0xF) 
    }; 

    System.out.println(sa[0]); 
    System.out.println(sa[1]); 

} 

我主要關注的是,在測試2()我預計只有能夠使用符號的值,但是我似乎能夠使用的值4095的4位(我在12位和15預計範圍爲-2048至2047和-8至7),它是如何與這些值一起工作的,我錯過了什麼?

而且另一個問題,爲什麼我不能在測試1使用1011111100110111()?

最後,以這種方式存儲信息是一個好主意嗎?該陣列將是約500x200或1000x 500類似的東西。

回答

4

之所以4095件作品在第二行,是因爲你在打印之前延長它的標誌。如果你明白無符號4095和-2048是完全一樣的,那麼你是如何解釋它們的。

如果打印出12位有符號數,這將是這樣的:'b1111_1111_1111,這將被解讀爲-2048。然而,你正在將它縮短爲在最後增加4位:'b0000_1111_1111_1111。 4095符合這個價值。

這同樣適用於15/-8,您打印前將其轉換爲更大的值。

+0

哈啊,當然,所述計算機不關心字節的整數值,直到它被解釋(即輸出),所有的時間之前,它僅僅是一個的1和0的串。天才,我完全錯過了。 – Neilos

相關問題