如何清除字节中的位?

时间:2014-02-24 09:53:38

标签: c# byte bit-manipulation

我需要设置清除一些字节数组的字节位。

设置效果不错,但清除无法编译(我猜是因为否定因为结果是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);

如何以 简单的方式清除字节中的位?

4 个答案:

答案 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