在表示位域的字节数组中操作位的有效方法
Efficient way to manipulate bits in byte array representing a bitfield
所以,我有一个表示位域的字节数组。字节数组的任何索引处的位 1 意味着我有相应的片段,反之亦然。现在,只要有相应的片段,我就需要将 0 的位值更改为 1。
我的问题是,如果我将字节数组转换为int数组然后更改数组索引的相应值更好,还是在字节数组中更简单?
如果是前者,如何将字节数组转换为整数数组?如果是后者,如何更改相应字节数组的值?
检查第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
所以,我有一个表示位域的字节数组。字节数组的任何索引处的位 1 意味着我有相应的片段,反之亦然。现在,只要有相应的片段,我就需要将 0 的位值更改为 1。
我的问题是,如果我将字节数组转换为int数组然后更改数组索引的相应值更好,还是在字节数组中更简单?
如果是前者,如何将字节数组转换为整数数组?如果是后者,如何更改相应字节数组的值?
检查第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