我使用以下代码进行转换:
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}
答案 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 感到困惑?通常从右到左阅读,而不是从左到右(或大端按位顺序)