好吧,所以我有4個整數我想長期包裝。 的4個整數所有包含3個值,定位在第一2個字節:包裝4位整數在64位長 - java按位
+--------+--------+
|xxpppppp|hdcsrrrr|
+--------+--------+
{PPPPPP}表示一個值,{HDCS}表示第二和{RRRR}最後一個。
我要收拾這些整數4,在很長的。我試過以下內容:
ordinal = (c1.ordinal() << (14*3) | c2.ordinal() << (14*2) | c3.ordinal() << 14 | c4.ordinal());
其中c1.ordinal()... c4.ordinal()是要包裝的整數。
這似乎不是,如果我運行一個測試工作。比方說,我想查找的最後一個整數的值長,c4.ordinal()
,其中{PPPPPP} = 41,{HDCS} = 8,{RRRR} = 14,我得到如下結果:
System.out.println(c4.ordinal() & 0xf); //Prints 14
System.out.println(hand.ordinal() & 0xf); // Prints 14 - correct
System.out.println(c4.ordinal() >> 4 & 0xf); // Prints 8
System.out.println(hand.ordinal() >> 4 & 0xf); // Prints 8 - correct
System.out.println(c4.ordinal() >> 8 & 0x3f); // Prints 41
System.out.println(hand.ordinal() >> 8 & 0x3f); // Prints 61 - NOT correct!
現在,以下對我來說很奇怪。如果刪除了前兩個整數,只有包裹最後兩個,像這樣:
ordinal = (c3.ordinal() << 14 | c4.ordinal());
並運行相同的測試,我得到正確的結果:
System.out.println(c4.ordinal() >> 8 & 0x3f); // Prints 41
System.out.println(hand.ordinal() >> 8 & 0x3f); // Prints 41 - correct!
我不知道什麼是錯。對我來說這沒有任何意義,如果我刪除前兩個整數,我會得到正確的答案。我開始着手這可能與長數據類型有關,但我還沒有發現任何東西,支持這一理論。
@Frederik:你爲什麼要以14的倍數上移,併爲4的倍數下移? – Welbog 2010-02-25 15:02:45
由於16位值的最後兩位始終爲0,所以它們無關緊要。 3個值中的2個是4位長,所以我每次移位4。 (最後一個是6位長,所以我需要使用另一個掩碼來表示這個值)。 – 2010-02-25 15:15:12