2014-10-16 40 views
0

在這種情況下,我需要在兩個相同大小的部分1001中拆分數字9(1001)的位。Java使用位移動將長整型的位分成兩部分

我的第一個想法是剛剛轉向,但對於正確的數字我沒有得到預期的結果,我懷疑這是由於標誌(在Java中沒有:(簽名)。

我當前的代碼是以下:

long num=9; 
System.out.println(Long.toBinaryString(num)); 
long num1=num>>2; 
System.out.println(Long.toBinaryString(num1)); 
long num2=num<<2; 
System.out.println(Long.toBinaryString(num2)); 

輸出:

1001 
10 
100100 

任何變通方法

+0

如果它是一個奇數位,你會怎麼做?讓我們說5 – agim 2014-10-16 17:52:07

+0

所以......你想計算一下位數,然後根據它進行分配? – hyde 2014-10-16 17:52:15

+0

這是正確的輸出:'9 >> 2'是'2'(二進制'10'),'9 << 2'是'36'(二進制'100100'))。 – rgettman 2014-10-16 17:53:40

回答

1

爲了克在下面的部分,你需要使用按位AND ...所以如果你向右移2位來獲得更高的部分,你需要與二進制數11(兩位爲1)來獲得較低的部分。這裏的代碼應該對任何移做它:

long num = 9; 
int shift = 2 

System.out.println(Long.toBinaryString(num)); 
long num1 = num >> shift; 
System.out.println(Long.toBinaryString(num1)); 
long num2 = num & ((1<<shift) - 1); 
System.out.println(Long.toBinaryString(num2)); 

計算num2的說明,爲shift 2,0B表示二進制文字,在僞代碼:

((1<<shift) - 1) == ((1<<2) - 1) == (0b100 - 1) == 0b11 == two bits set 

從它應該清楚它將如何爲任何shift價值工作。

1

您可以將num1移回2並將其從num中減去。這會給你num2