[编辑]
我意识到不幸的是我过度简化了问题并且答案并没有真正帮助我,所以我重新措辞......
所以,我的情况是我有一个传入字节流(样本),其中唯一可能设置的位是第一个(0000 | 0001)。
所以,假设我得到了一个如下所示的序列:
0000,000**0**,
0000,000**1**,
0000,000**0**,
0000,000**1**,
0000,000**0**,
0000,000**0**,
0000,000**0**,
0000,000**0**
我将相关位设置为粗体,以便更清楚地了解我实际收集的内容。
因此,当这些“位”到达时,我需要将它们分类为如下所示的内容:0000,1010
我这样做是通过移动现有值 >> 1 然后添加移动的传入值 << 7
byte aggregateByte = 0;
//loop 8 times as incoming samples arrive...
aggregateByte = (aggregateByte >> 1) + incomingSample << 7
这(*应该)产生正确的结果。
但是,因为 java 没有签名/签名的概念,所以每次我转移时,因为我从左侧开始,如果前一个传入位是 1,java 保留 1,因为它认为这是符号位并且永远不允许它重置回 0。
所以......在添加我的传入位之前我需要做的是将现有字节中的第一位翻转为 0,然后传入位将设置为需要设置的任何值。
目前我正在通过设置 0x7F 的掩码并将其与字节 &ing 来做到这一点。
所以,我的实际添加看起来像这样: ((aggregateByte >> 1) & 0x7F ) + incomingSample << 7
0x7F 创建一个如下所示的掩码:0111,111 因此,当 I & this 针对现有值时,它会将最后一位翻转为 0。
我想我的问题是“我是在重新发明轮子吗,有没有更好的方法来处理这个问题,或者这会可靠地工作并且是处理这个过程的一种相对有效的方法?”