java,在一次操作中将前3位从一个字节转移到另一个字节

java,在一次操作中将前3位从一个字节转移到另一个字节,java,bit-manipulation,bits,Java,Bit Manipulation,Bits,我想把前3位从一个字节转移到另一个字节。目前,我使用以下方法,但速度太慢(错误的分支预测会减慢速度)> byte newByte=0; 如果((旧字节>>0)&1)==1)新字节|=1>1)&1)==1)新字节|=1>2)&1)==1)新字节|=1 我会成功的。这是因为0b111用作掩码,因此在执行计算后,只有oldByte中最右边的三位将保留其原始值;oldByte中的其余位将设置为0。然后将结果分配给newByte。您需要将结果强制转换为字节,因为按位&运算符生成的int,大于字节,因此必须

我想把前3位从一个字节转移到另一个字节。目前,我使用以下方法,但速度太慢(错误的分支预测会减慢速度)>

byte newByte=0;
如果((旧字节>>0)&1)==1)新字节|=1>1)&1)==1)新字节|=1>2)&1)==1)新字节|=1
我会成功的。这是因为0b111用作掩码,因此在执行计算后,只有
oldByte
中最右边的三位将保留其原始值;
oldByte
中的其余位将设置为0。然后将结果分配给
newByte
。您需要将结果强制转换为
字节
,因为按位&运算符生成的
int
,大于
字节
,因此必须强制转换才能正确转换

如果要从oldByte中获取前n位,而不是前3位,可以执行以下操作:

byte newByte = (byte) (oldByte & ((1 << n) - 1));
我会成功的。这是因为0b111用作掩码,因此在执行计算后,只有
oldByte
中最右边的三位将保留其原始值;
oldByte
中的其余位将设置为0。然后将结果分配给
newByte
。您需要将结果强制转换为
字节
,因为按位&运算符生成的
int
,大于
字节
,因此必须强制转换才能正确转换

如果要从oldByte中获取前n位,而不是前3位,可以执行以下操作:

byte newByte = (byte) (oldByte & ((1 << n) - 1));

回答得好。您必须先将结果转换为
字节
,然后才能分配它,对吗?@sstan您是对的。我正在用这些信息编辑答案。下面的方法也可以吗?字节newByte=oldByte&(字节)9b111@DeanJ
byte newByte=oldByte&(byte)0b111
不起作用,因为即使两个操作数的类型都是
byte
,结果仍然是
int
。但我不知道为什么。这是一条在《圣经》中定义的规则。很好的答案。您必须先将结果转换为
字节
,然后才能分配它,对吗?@sstan您是对的。我正在用这些信息编辑答案。下面的方法也可以吗?字节newByte=oldByte&(字节)9b111@DeanJ
byte newByte=oldByte&(byte)0b111
不起作用,因为即使两个操作数的类型都是
byte
,结果仍然是
int
。但我不知道为什么。这是《宪法》中规定的规则。
byte newByte = (byte) (oldByte & ((1 << n) - 1));
(1 << n) - 1
(1 << 3) - 1
0b1000 - 1
0b111