我有一个32字节的字节数组,其中每个字节的前4位(0到3)表示1到128之间的数字的设置或未设置状态。例如,如果给出数字3,我需要在数组的第一个字节中设置第2位。如果给出数字9,我需要设置数组中第三个字节的第0位。我遇到的问题是在C#中找到一种合理的方法。我确信必须有一种简单的方法以数学方式进行,但到目前为止还没有找到方法。虽然我在这个问题上摸不着头脑,但我以为我会看看是否有人可以给出一些建议。
---------更新-------------------
根据给出的答案,我产生了以下功能。这完全符合我的需要。我可能没有在我的问题中明确说明我需要什么,但是给了我足够的建议来找到正确的代码。
// outputNumber = number passed into this function
byte[] bytes = new byte[32];
int bit = (outputNumber - 1) % 4;
byte byteSetting = (byte)(1 << bit);
bytes[(outputNumber - 1) / 4] |= byteSetting;
答案 0 :(得分:2)
int byt = bitNumber / 4; // You could do byt = bitNumber >> 2
int bit = bitNumber % 4; // You could do bit = bitNumber & 3
bytes[byt] |= (byte)(1 << bit);
bytes
是你的字节数组。
要重置它:
bytes[byt] &= (byte)(byte.MaxValue ^ (1 << bit));
读取字节的值:
var res = bytes[byt] & (byte)(1 << bit)
(如果您有兴趣,^
是xor运算符)
答案 1 :(得分:2)
您可以设置数组中每个字节的位,如下所示:
array[2] |= (byte)(1<<3); // set bit #4 / index 3 in array element #3 / index 2
你可以这样清楚:
array[2] &= unchecked((byte)(~(1<<3))); // clear the same bit we set previously
答案 2 :(得分:1)
需要类似的东西。在64位系统上使用ulongs(32位 - > uint)而不是字节。性能差异非常显着。
public struct BitField {
private ulong[] _Values;
private BitField(ulong[] values) {
_Values = values;
}
public static BitField New() {
return new BitField(new ulong[] { 0ul, 0ul });
}
public BitField Clone() {
return new BitField(new ulong[] { _Values[0], _Values[1] });
}
public void Clear() {
_Values[0] = ulong.MinValue;
_Values[1] = ulong.MinValue;
}
public void SetAll() {
_Values[0] = ulong.MaxValue;
_Values[1] = ulong.MaxValue;
}
public void AND_Combine(BitField bitField) {
_Values[0] &= bitField._Values[0];
_Values[1] &= bitField._Values[1];
}
public void OR_Combine(BitField bitField) {
_Values[0] |= bitField._Values[0];
_Values[1] |= bitField._Values[1];
}
public bool Intersects(BitField bitField) {
if ((_Values[0] & bitField._Values[0]) > 0) {
return true;
}
else {
if ((_Values[1] & bitField._Values[1]) > 0) {
return true;
}
else {
return false;
}
}
}
public bool this[int index] {
get {
if (index > 127 || index < 0) {
return false;
}
int item = index >> 6;
int bit = index % 64;
ulong compare = 1ul << bit;
return ((_Values[item] & compare) == compare);
}
set {
if (index >= 0 || index < 128) {
int item = index >> 6;
int bit = index % 64;
ulong compare = 1ul << bit;
if (value) {
_Values[item] |= compare;
}
else {
_Values[item] &= ~compare;
}
}
}
}
}