Java中的位移时奇怪的结果

时间:2014-04-16 16:19:14

标签: java byte bit-manipulation

我正在尝试隔离彼此相邻的两个字节添加它们,但似乎有一些额外的位有时会出现,我无法弄清楚如何摆脱它。它正在摒弃答案。 代码是:

(acc & 0x00000000ff000000L) + ((acc << 8) & 0x00000000ff000000L);

我得到的结果如

0x0000000147000000

什么时候应该

0x0000000047000000

如何摆脱1?

编辑:acc很长。我尝试添加第5个和第6个字节,然后该值将进入第5个字节位置的新长度。

2 个答案:

答案 0 :(得分:1)

你需要在最后屏蔽你想要的位,因为添加可能会带有一点:

((acc & 0x00000000ff000000L) + ((acc << 8) & 0x00000000ff000000L)) & 0x00000000ff000000L;

我认为如果你把它分解一下可能会更清楚:

acc&=0x00000000FFFF000000L; // isolate bytes 5 and 4
acc+=(acc<<8);              // add the two bytes (we'll strip bytes 6 & 4 next)
acc&=0x00000000FF00000000L; // reduce to byte 5 only

恰好是一个不那么按位的操作。

答案 1 :(得分:0)

如果我理解正确,你想获得第5和第6字节的值,将它们加在一起,并将它们存储在一个新的长整数中,该长整数只包含第5个字节中的和。这将是这样做的:

long 5thByte = acc & 0xff00000000 >>> 32;
long 6thByte = acc & 0xff0000000000 >>> 40;
long sum = 5thByte + 6thByte;
long longWithNewByte = sum << 32;

如果总和高于255,这当然会转移到第6个字节。要摆脱那个遗留物,你可以使用另一个掩码。

long longWithNewByte &= 0xff00000000;