Java 字节到位集转换
我正在使用以下代码进行转换:Java 字节到位集转换,java,Java,我正在使用以下代码进行转换: public static BitSet fromByte(byte b){ BitSet bs = new BitSet(8); for (int i=0; i<8; i++){ if ((b & (1 << i)) > 0){ bs.set(i); } } int length = bs.length(
public static BitSet fromByte(byte b){
BitSet bs = new BitSet(8);
for (int i=0; i<8; i++){
if ((b & (1 << i)) > 0){
bs.set(i);
}
}
int length = bs.length();
return bs;
}
公共静态位集fromByte(字节b){
位集bs=新位集(8);
对于(int i=0;i您正在按以下顺序检查位:
00000001 = index 0
00000010 = index 1
00000100 = index 2
00001000 = index 3
etc.
i、 e.从右到左,并将其从左到右存储在位集中。您正在按以下顺序检查位:
00000001 = index 0
00000010 = index 1
00000100 = index 2
00001000 = index 3
etc.
i、 e.从右到左,并将它们从左到右存储在位集中。{0,3,4,5,6}等于:
正如您所猜测的,0也是位等于1的标记。但位的顺序是从右到左。{0,3,4,5,6}等于:
正如您所猜测的,0也是位等于1的标记。但是位是从右到左排列的。字节中的位是从右到左编号的,而不是从左到右编号的。这就是设置位{0,3,4,5,6}
定义此模式的原因:
7 6 5 4 3 2 1 0
0 1 1 1 1 0 0 1
字节中的位从右向左编号,而不是从左向右编号。这就是为什么设置位{0,3,4,5,6}
定义此模式:
7 6 5 4 3 2 1 0
0 1 1 1 1 0 0 1
位集的长度将尽可能少地表示所设置的位。例如,如果设置前三位,长度将为2,因为表示只需要2位
位集的构造函数设置其大小,而不是长度。我怀疑它们是两个不同的概念
当我运行代码时,我得到了预期的结果。您确定要传递的值吗?也许您对位的尾数感到困惑?通常它是从右到左读取的,而不是从左到右(或大尾数按位顺序)位集的长度将尽可能少,以表示所设置的位。例如,如果设置前三位,长度将为2,因为表示只需要2位
位集的构造函数设置其大小,而不是长度。我怀疑它们是两个不同的概念
当我运行你的代码时,我得到了我期望的结果。你确定你传递的值吗?也许你对你的位的尾数感到困惑?通常它是从右到左读取的,而不是从左到右读取的(或大尾数按位顺序){0,3,4,5,6}请解释一下位集是如何工作的,因为我怀疑{0,3,4,5,6}表示位为1的索引。为什么不使用我假设0表示位NR7。它是位为1的索引,但从右开始,而不是从左开始。{0,3,4,5,6}是01111001,不是01001111。请给我解释一下位集是如何工作的,因为我怀疑{0,3,4,5,6}表示位为1的索引。为什么不使用呢?我假设0表示位NR7。它是位为1的索引,但从右开始,而不是从左开始。问题是“endianess”。我认为第一位(从左开始)是MSB,类似于Big-Endian。我是以位操作/表示形式开始的。问题出在“endianess”上。我认为第一位(从左开始)是MSB,类似于Big-Endian。我是以位操作/表示形式开始的。我尝试的是从字节值获取位[1..4]表示的值(其中0位是MSB—最重要的位)。这5位表示AMR音频帧头中使用的某些编解码器。但我不知道MSB位于何处。01111001—位于右侧还是左侧?这4位应为1111或1001。@AlexandruCircus更可能位于左侧。我尝试的是获取由这些位表示的值[1..4]从字节值(其中0位是MSB-最重要的位)。这5位代表AMR音频帧头中使用的某些编解码器。但我不知道MSB位于何处。01111001-在右侧还是左侧?这4位应该是1111或1001。@AlexandruCircus更可能在左侧。