3

[编辑]

我意识到不幸的是我过度简化了问题并且答案并没有真正帮助我,所以我重新措辞......

所以,我的情况是我有一个传入字节流(样本),其中唯一可能设置的位是第一个(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。

我想我的问题是“我是在重新发明轮子吗,有没有更好的方法来处理这个问题,或者这会可靠地工作并且是处理这个过程的一种相对有效的方法?”

4

2 回答 2

4

也不|&用于切换位。为此,您需要使用^. 但是 0x40 确实是翻转第 6 位(在您的术语中为“第 7”)的正确值。

于 2013-08-19T16:03:49.787 回答
3

翻转第 3 位:

 final int N = 3;
 b = (byte) (b ^ (1 << N));
于 2013-08-19T16:05:02.067 回答