【问题标题】:Bit Order of Java BitSetJava BitSet 的位顺序
【发布时间】:2016-07-20 06:31:53
【问题描述】:

我有以下代码:

byte[] byteArr = new byte[1];
byte b = (byte) Integer.parseInt("127");
byteArr[0] = b;
BitSet bs = BitSet.valueOf(byteArr);

在最后一行设置断点后,我得到了一个意外的调试器输出:

在二进制方面,“bs”的值似乎是“11111110”,而我希望它的值是“01111111”(127)。截断似乎无法解释,因为只有最后 8 位是相关的(并且 127 的 MSB 未设置)。

这是一个问题,因为我想将它用作其他位串的位掩码。是什么导致了这种行为?是否有解决方法来保留预期的位顺序?

【问题讨论】:

  • 什么?这看起来很好。我不确定您如何将其解释为“11111110”。
  • 我将 {0, 1, 2...} 解释为 BitSet 中设置位的索引。由于前七位已设置,因此 BitSet 的值似乎为“11111110”(十进制 254)。
  • @MichaelHang 那你怎么知道BitSet代表8位?
  • byte[] byteArr 填充了单个字节。我假设 BitSet 静态构造函数不会删除尾随的未设置位。此外,使用 Integer.parseInt("254") 运行代码会返回 {1, 2, .., 7}
  • 索引0 是最右边的位。所以,{0,1,2,3,4,5,6} 表示除了最左边的位之外的每个位都已设置,即01111111。

标签: java byte endianness bitset


【解决方案1】:

BitSet 分配字(表示为长数组)并根据所需的位数创建它们。

由于您只想表示一个字节,所以它可以表示为一个字(64 位/长)。在 64 位中是 little-endian 表示,位从最低有效位到最高有效位排序。

您可以使用 get(int bitIndex) 检查自己,它对单词执行“与”操作以返回在该位置设置的位

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2016-09-09
    • 2016-09-01
    相关资源
    最近更新 更多