我正在尝试隔离彼此相邻的两个字节添加它们,但似乎有一些额外的位有时会出现,我无法弄清楚如何摆脱它。它正在摒弃答案。 代码是:
(acc & 0x00000000ff000000L) + ((acc << 8) & 0x00000000ff000000L);
我得到的结果如
0x0000000147000000
什么时候应该
0x0000000047000000
如何摆脱1?
编辑:acc很长。我尝试添加第5个和第6个字节,然后该值将进入第5个字节位置的新长度。
答案 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;