我需要设置和清除一些字节数组的字节位。
设置效果不错,但清除无法编译(我猜是因为否定因为结果是int而且当时它是负数而且......)。
public const byte BIT_1 = 0x01;
public const byte BIT_2 = 0x02;
byte[] bytes = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
// set 1st bit
for (int i = 0; i < bytes.Length; i++)
bytes[i] |= BIT_1;
// clear 2nd bit (set it to 0)
for (int i = 0; i < bytes.Length; i++)
bytes[i] &= (~BIT_2);
如何以 简单的方式清除字节中的位?
答案 0 :(得分:9)
试试这个:
int i = 0;
// Set 5th bit
i |= 1 << 5;
Console.WriteLine(i); // 32
// Clear 5th bit
i &= ~(1 << 5);
Console.WriteLine(i); // 0
字节版本(在这种情况下仅在字节上):
byte b = 0;
// Set 5th bit
b |= 1 << 5;
Console.WriteLine(b);
// Clear 5th bit
b &= byte.MaxValue ^ (1 << 5);
Console.WriteLine(b);
答案 1 :(得分:2)
看来如果不先将字节转换为int,就不能这样做。
byte ClearBit(byte b, int i)
{
int x = Convert.ToInt32(b);
x &= ~(1 << i);
return Convert.ToByte(x);
}
答案 2 :(得分:1)
这可以通过转换为int
然后再转回来来避免:
bytes[i] = (byte)(bytes[i] & ~(BIT_2));
答案 3 :(得分:0)
按字节操作不是在字节上定义的,而是使用字节will always return an int。因此,当您在字节上使用按位NOT时,它将返回一个int,因此当您尝试将AND与其他字节进行AND运算时会产生错误。
要解决此问题,您需要再次将结果显式地转换为字节。
byte bit = 0x02;
byte x = 0x0;
// set
x |= bit;
Console.WriteLine(x); // 2
// clear
x &= (byte)~bit;
Console.WriteLine(x); // 0