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更可能在左侧。