2014-07-23 135 views
0

我試圖將數字(8位)(0..255)拆分爲兩個數字,如: 100(二進制01100100)分成6(0110)和4(0100)。拆分爲兩部分

在CI做到在這樣的方式:

short row = value >> 4; //value - uint8_t 
short col = (row << 4)^value; 

在Java中我做的其他方式(因爲C代碼一樣無法正常工作):

short v1 = (byte)(value >> 4); 
short v2 = (byte)((byte)(value << 4) >>> 4); 

它適用於數字從0到103.但對於大於103的數字,它不起作用。

p.s. 其實問題在這裏:

short v2 = (byte)((byte)(value) >>> 4); 
=>104 (1101000). I expected to see something like this: 00001000, but result is 11111000 
=>103 (1100111). Result is 111; 

修復。

我固定它以這樣的方式:

short value = (byte)255; 
short v1 = 0; 
short v2 = 0; 

for(int i = 3; i >= 0; i--) { 
    v2 = (short) (v2 << 1 | ((value >> i) & 1)); 
    v1 = (short) (v1 << 1 | (value >> (i + 4) & 1)); 
} 
System.out.println(v1 + " " + v2); 

但我更喜歡的C方式,它更簡單。

+0

在Java中沒有無符號數字。 –

+0

你的意思是說我不能以這種方式拆分數字嗎?我應該用另一種方法嗎? – FruitDealer

+0

您的解決方案非常複雜,即使您的C解決方案對於簡單任務來說也非常複雜。 –

回答

2
short row = (value >> 4) & 0x0F; 
short col = value & 0x0F; 

這也應該在C.工作

&只保留其在相同的位置是1位:

11111000 // 104 
00001111 // 0x0F == 15 
-------- 
00001000 // 104 & 0x0F == 8 
      // because only the fourth bit from right is 1 in both numbers! 
+0

是的,它的工作原理!謝謝 – FruitDealer

1
unsigned char f = 100; 
unsigned char first = f >> 4; 
unsigned char second = 0xF & f; 
printf("%d %d", first, second); 

00001111,如果你位與,數量,您將得到最後4位

+0

1)Java不知道無符號字符2)signed char會給出負數的問題 –

+0

他說c方式,而不是java ...第二個是你不能從8位獲得兩個有符號數。如果你想要它,你必須寫你自己的結構或方法1位的符號和7位的價值如何你分裂這個數字爲負? – DRoW

+0

1)再次閱讀這個問題,他向我們展示了他如何在C中做它,然後詢問如何在Java中做到這一點(或者更確切地說,爲什麼這在Java中不起作用)2)問題標記爲Java 3)如果一個有符號字符的位表示是'10010110',那麼結果值應該有:'1001'和'0110',符號被忽略。 –

0

試試這個。

short v1 = (byte)(value >> 4); 
short v2 = (byte)((byte)(value << 4) >>> 4); 

if(v2<0){ 
v2 = (short) -v2; 
} 
+0

不適用於某些數字,如'250'和'255' –