如何检查C#中是否设置了特定位

时间:2011-11-08 16:48:06

标签: c# bit-manipulation bit

在C#中,我有一个32位的值,我存储在一个int中。我需要查看是否设置了特定位。我需要的是0x00010000

我提出了这个解决方案:

以下是我要找的内容:

Hex:       0    0    0    1     0    0    0    0    0 
Binary   0000|0000|0000|0001|0000|0000|0000|0000|0000

所以我右移16位,这会给我:

Hex:       0    0    0    0     0    0    0    0    1
Binary   0000|0000|0000|0000|0000|0000|0000|0000|0001

然后我向左移位3,这会给我:

Hex:       0    0    0    0     0    0    0    0   8 
Binary   0000|0000|0000|0000|0000|0000|0000|0000|1000

然后我将32位值写入一个字节,看看它是否等于8.

所以我的代码会是这样的:

int value = 0x102F1032;
value = value >> 16;
byte bits = (byte)value << 3;
bits == 8 ? true : false;

有没有更简单的方法来检查是否在没有所有移位的情况下设置了特定位?

9 个答案:

答案 0 :(得分:13)

您可以使用按位&amp;操作者:

int value = 0x102F1032;
int checkBit = 0x00010000;
bool hasBit = (value & checkBit) == checkBit;

答案 1 :(得分:10)

比这容易得多。只需像这样使用按位AND运算符

(value & 0x00010000) != 0

答案 2 :(得分:4)

您可以这样检查:

bool bitSet = (value & 0x10000) == 0x10000;

答案 3 :(得分:3)

如果您不喜欢位掩码方法:

int data = 0;

var bits = new BitArray(new int[] { data });

bits.Get(21);

(我可能得错了,你找的不是21)

对于只有32位的情况,我可能会有点滥用,但如果你需要处理更长的位数,那就更清楚了。

答案 4 :(得分:2)

你可以做一个按位AND。

int result = yourByte & 16;
if (result != 0)
{
    // do what you need to when that bit is set
}

答案 5 :(得分:2)

使用bitwise and operator &

return (value & 0x100000) != 0;

答案 6 :(得分:2)

你可以说:

if( (number & 0x00010000 ) != 0 )
{
  //the bit is set...
}

答案 7 :(得分:2)

int someInt = 8;
int BitToTest = 3;
bool isSet = (someInt & (1 << BitToTest)) != 0;

如果回答的值非零,则设置为移位值。 如果你正在做一个位,那么使用一个常量(1&lt;&lt;&lt;&lt; BitToTest),如果很多但不同的位,一个静态数组要查找2 ^ BitToTest。

答案 8 :(得分:1)

此外,但也许不是更好,您可以使用BitVector32结构。

int value =  0x102F1032;
var vector = new BitVector32(value);
return vector[0x1000]; //true