字节到BitSet的转换

时间:2013-07-05 15:53:07

标签: 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();

    return bs;
}  

输出为{0,3,4,5,6}(来自bs的调试器显示) - 设置位的索引。我认为这应该代表1001111,长度= 7,但是错误,因为1001111是79,而不是121.我还希望长度为8.基本上我想要一个长度为8的bitSet,它正确表示任何字节数。我的期望是01111001,并显示调试器以显示{1,2,3,4,5,7}

4 个答案:

答案 0 :(得分:2)

一个字节中的位从右到左编号,而不是从左到右编号。这就是设置位{0, 3, 4, 5, 6}定义这种模式的原因:

7 6 5 4 3 2 1 0
0 1 1 1 1 0 0 1

答案 1 :(得分:1)

您正按此顺序检查位:

00000001 = index 0
00000010 = index 1
00000100 = index 2
00001000 = index 3
etc.

即。从右到左,并在位集中从左到右存储它们。

答案 2 :(得分:1)

{0,3,4,5,6}等于: (2 ^ 0) | (2 ^ 3) | (2 ^ 4) | (2 ^ 5) | (2 ^ 6)

2^0 = 00000001
2^3 = 00001000
2^4 = 00010000
2^5 = 00100000
2^6 = 01000000
--------------
      01111001

就像你猜测的那样,0也是一个等于1的指示。但这些位是从右到左排序的。

答案 3 :(得分:1)

位集的长度将尽可能少,以表示您设置的位。例如,如果设置前三位,则长度将为2,因为表示只需要2位。

BitSet的构造函数设置大小,而不是长度。我怀疑它们是两个不同的概念。

当我运行你的代码时,我得到了我期望的结果。你确定你传递的价值吗?也许你对你的位的 endianess 感到困惑?通常从右到左阅读,而不是从左到右(或大端按位顺序