Java 将字节拆分为位

Java 将字节拆分为位,java,android,byte,Java,Android,Byte,我有一个字节数组,即从字节[0]到字节[2]。我想首先将字节[0]拆分为8位。然后是字节[1],最后是字节[2]。通过拆分,我的意思是如果字节[0]=12345678,那么我想拆分为变量A=8,变量B=7,变量C=6,变量D=5,。。。。。。。。变量H=0。如何拆分字节并将位存储到变量中?我想在JAVA中实现这一点,按位操作似乎就是您所说的。 一个字节由8位组成,因此它的范围为0到255。 用二进制写的,从00000000到11111111 按位操作基本上是使用掩码从一个字节中获取尽可能多的信息

我有一个字节数组,即从字节[0]到字节[2]。我想首先将字节[0]拆分为8位。然后是字节[1],最后是字节[2]。通过拆分,我的意思是如果字节[0]=12345678,那么我想拆分为变量A=8,变量B=7,变量C=6,变量D=5,。。。。。。。。变量H=0。如何拆分字节并将位存储到变量中?我想在JAVA中实现这一点,按位操作似乎就是您所说的。 一个字节由8位组成,因此它的范围为0到255。 用二进制写的,从00000000到11111111

按位操作基本上是使用掩码从一个字节中获取尽可能多的信息

例如,假设您有11010011字节(添加的空间仅用于可见性)=211(十进制)。您可以将其拆分为两个“变量”b1和b2,每个变量半字节。因此,它们将覆盖0到15的范围

如何做到这一点是通过定义一些遮罩。获取前半个字节值的掩码为0000 1111。 取11010011的值,对其应用按位and(&)运算符。 也就是说,字节b=211;字节mask1=15;或字节b=0x11010011;字节mask1=0x00001111; 然后就有了变量byte b1=b&mask1

因此,应用该操作将导致b1=00000011=3; 掩码字节mask2=0x11110000;对b应用相同的操作,您将得到字节b2=mask2&b=0x11010000

当然,这使得b2这个数字对你来说可能太大了。如果要获取值0x1101,只需将其右移。因此b2>>=4

您可以使用任何形式的掩码,但通常使用十进制的2次方(这样您就可以从字节中提取任何位)或决定变量的范围,并使掩码“更大”,如0x00000011或ox00001100。这两个掩码将分别从一个字节中获取2个值,每个值的范围为0到3,一个字节中可以容纳4个值

有关更多信息,请勾选

很抱歉,这些值有点偏离(因为字节似乎从-128变为127,但想法是一样的)


第二次编辑(我自己从来没有使用过按位操作).“0x”符号是十六进制的。所以你实际上必须自己计算01001111的实际含义…很糟糕:|但它会起作用。

@Samir:谢谢Samir。如果你回答了我的问题,我会更高兴的。你试过
整数。tobinarysting(你的字节值)
?你说:“我的意思是,如果字节[0]=12345678",一个字节变量的值为
12345678
,根据sun规范,一个字节的值为
-128
127
@MJM。为了创建一个有意义的示例,我认为OP过于简化了。它在技术上不正确,但它有效地说明了OP的问题。只是一个小注释:你确定应该再次检查吗st 0不是1?@BorisStrandjev他应该检查>0。因为0x80和0x80仍然是0x80。@BorisStrandjev——你是对的——有点——应该是
!=0
。我想我有点匆忙。
boolean a = (theByte & 0x1) != 0;
boolean b = (theByte & 0x2) != 0;
boolean c = (theByte & 0x4) != 0;
boolean d = (theByte & 0x8) != 0;
boolean e = (theByte & 0x10) != 0;
boolean f = (theByte & 0x20) != 0;
boolean g = (theByte & 0x40) != 0;
boolean h = (theByte & 0x80) != 0;