来自 byte[] 的 BitSet 具有奇怪的长度

BitSet from byte[] with strange lenght

我的代码是:

String blah = "blah";
byte[] blahBytes = blah.getBytes("US-ASCII");
System.out.println(Arrays.toString(blahBytes));
BitSet set = BitSet.valueOf(blahBytes);
System.out.println(set.length());

输出是:

[98, 108, 97, 104]
31

为什么 length() 返回 31?不应该是32吗?

位集长度由设置为1的最高位的位置决定。由于传递给构造位集的所有字节都表示 UNICODE 的 ASCII 字符子集,因此第 8 位始终为零。因此,设置为 1 的最高位将是第 30 位或第 31 位,具体取决于字符串末尾的字母或数字:如果您传递 "bla1" 而不是 "blah"会得到 30 (demo 1). If you use control characters, such as <TAB> you could get an even shorter bit set of 28 (demo 2).

如果您想将长度四舍五入为下一个 8 的倍数,请使用

int roundedLength = 8 * ((set.length() + 7) / 8);

demo 3