0

我正在使用以下代码进行转换:

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 的调试器显示) - 设置位的索引。我认为这应该表示长度为 7 的 1001111,但这是错误的,因为 1001111 是 79,而不是 121。另外我希望长度为 8。基本上我想要一个长度为 8 的 bitSet,它正确地表示任何字节数。我的期望是 01111001 和调试器的显示显示 {1,2,3,4,5,7}

4

4 回答 4

2

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

7 6 5 4 3 2 1 0
0 1 1 1 1 0 0 1
于 2013-07-05T16:02:04.923 回答
1

您正在按以下顺序检查位:

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

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

于 2013-07-05T16:01:17.273 回答
1

位集的长度将与表示您设置的位所需的位数一样少。例如,如果您设置前三位,则长度将为 2,因为表示只需要 2 位。

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

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

于 2013-07-05T16:02:21.487 回答
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 的索引。但是位是从右到左排序的。

于 2013-07-05T16:01:27.143 回答