将数字分成两部分

时间:2014-07-23 10:29:15

标签: java

我试图将数字(8位)(0..255)分成两个数字,如下所示: 100(二进制01100100)分为6(0110)和4(0100)。

在C中,我这样做:

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方式,它更简单。

3 个答案:

答案 0 :(得分: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!

答案 1 :(得分:1)

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

00001111如果你按位且有数字,你将得到最后4位

答案 2 :(得分:0)

试试这个。

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

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