[编辑]
我意识到,不幸的是我过度简化了这个问题而且答案并没有真正帮助我,所以我正在改写它......
所以,我的情况我有一个输入字节流(样本),其中可能设置的ONLY位是第一个(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的掩码并对该字节进行&amp; ing来实现这一点。
所以,我的实际添加如下: ((aggregateByte&gt;&gt; 1)&amp; 0x7F)+ incomingSample&lt;&lt; 7
0x7F创建一个如下所示的掩码: 0111,111 所以,当我和我这与现有值相反,它将最后一位翻转为0。
我想我的问题是“我是否重新发明轮子,是否有更好的方法来解决这个问题,或者这种方法是否能够可靠地运行并且是处理这一过程的一种相对有效的方法?”
答案 0 :(得分:4)
|
和&
都不是用于切换位。为此,您需要使用^
。但是0x40确实是翻转第6位的正确值(在你的术语中是“第7”)。
答案 1 :(得分:3)
翻转第3位:
final int N = 3;
b = (byte) (b ^ (1 << N));