在保留其余部分的同时翻转字节中的一位的正确方法是什么?



[EDIT]

我意识到,不幸的是,我把这个问题过于简单化了,答案对我没有真正的帮助,所以我重新措辞…

因此,在我的情况下,我有一个传入字节流(示例),其中唯一可能设置的位是第一个(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**

我将相关部分设置为粗体,以便更清楚地了解我实际收集的内容。

因此,当这些"比特"到达时,我需要将它们分类为如下所示:00001010

我通过将现有值>>1移位,然后将移位了<lt;7

byte aggregateByte = 0;
//loop 8 times as incoming samples arrive...
aggregateByte = (aggregateByte >> 1) + incomingSample << 7

这(*应该)产生正确的结果。

但是,因为java没有signed/insigned的概念,所以每次我移位时,因为我从左手边开始,如果上一个传入位是1,java就会保存1,因为它将其视为符号位,并且从不允许它重置回0。

所以。。。在添加传入比特之前,我需要做的是将现有字节中的第一个比特翻转为0,然后将传入比特设置为需要设置的任何值。

目前,我通过设置0x7F和&将其与字节进行比较。

因此,我实际添加的内容如下:((aggregateByte>>1)&0x7F)+输入采样<lt;7

0x7F创建的掩码如下所示:0111111所以,当我&相对于现有值,它将最后一位翻转为0。

我想我的问题是"我是在重新发明轮子吗?有更好的方法来处理这个问题吗?还是这会可靠地工作?是一种相对有效的方法来解决这个问题?"

|&都不用于切换位。为此,您需要使用^。但0x40确实是翻转第6位的正确值(用你的术语来说是"第7位")。

翻转位3:

 final int N = 3;
 b = (byte) (b ^ (1 << N));

最新更新