【问题标题】:Efficient way to manipulate bits in byte array representing a bitfield操作表示位域的字节数组中的位的有效方法
【发布时间】:2018-05-12 16:17:27
【问题描述】:

所以,我有一个代表位域的字节数组。字节数组的任何索引处的位 1 意味着我有相应的片段,反之亦然 0。现在,只要我有相应的片段,我就需要将位值 0 更改为 1。

我的问题是,如果我将字节数组转换为int数组,然后更改数组索引的相应值会更好还是在字节数组中更简单?

如果是前者,如何将字节数组转换为整数数组?如果是后者,如何改变对应字节数组的值?

【问题讨论】:

  • 您可以使用bitwise operators。无需转换为其他整数。
  • 你为什么不使用内置的java.util.BitSet 类?它正是针对这种用例而设计的。
  • @JimGarrison 谢谢!我不知道它的存在。
  • 另请注意,BitSet 内部使用 long[]

标签: java bit-manipulation bit-fields


【解决方案1】:

检查第 n 位是否为真

boolean get(int n, byte[] bitField)
{
    return (bitField[n >> 3] & 1 << (n & 0x7)) != 0; //or use n / 8 and n % 8
}

设置位n

void set(int n, byte[] bitField, boolean value)
{
    if(value)
        bitField[n >> 3] |= 1 << (n & 0x7);
    else
        bitField[n >> 3] &= ~(1 << (n & 0x7));
}

如果你使用BitSet,会简单一些

实例化

BitSet bitField = new BitSet(); //can specify size

检查第 n 位是否为真

bitField.get(n);

设置位n

bitField.set(n, value); //can also use set(int) and clear(int) instead

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2015-03-21
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2010-11-05
    • 2016-06-03
    相关资源
    最近更新 更多