Как проверить, установлен ли определенный бит в C # - PullRequest
10 голосов
/ 08 ноября 2011

В 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 ]

13 голосов
/ 08 ноября 2011

Вы можете использовать побитовый оператор &:

int value = 0x102F1032;
int checkBit = 0x00010000;
bool hasBit = (value & checkBit) == checkBit;
10 голосов
/ 08 ноября 2011

Это намного проще, чем это.Просто используйте побитовый оператор AND, как этот

(value & 0x00010000) != 0
4 голосов
/ 08 ноября 2011

Вы можете просто проверить так:

bool bitSet = (value & 0x10000) == 0x10000;
3 голосов
/ 08 ноября 2011

И если вам не нравится подход с битовой маской:

int data = 0;

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

bits.Get(21);

(возможно, у меня неправильный счет, а вы ищете не 21)

Это может менянемного оскорбительно для случая, когда у вас есть только 32 бита, но если вам нужно работать с более длинными битовыми массивами, это намного яснее.

2 голосов
/ 08 ноября 2011
int someInt = 8;
int BitToTest = 3;
bool isSet = (someInt & (1 << BitToTest)) != 0;

И это со смещенным значением, бит устанавливается, если ответ ненулевой.Если вы делаете один бит много, используйте константу для (1 << BitToTest), если много, но разные биты, статический массив для поиска 2 ^ BitToTest. </p>

2 голосов
/ 08 ноября 2011

Вы можете сказать:

if( (number & 0x00010000 ) != 0 )
{
  //the bit is set...
}
2 голосов
/ 08 ноября 2011

Используйте поразрядно и оператор &:

return (value & 0x100000) != 0;
2 голосов
/ 08 ноября 2011

Можно просто поразрядно И.

int result = yourByte & 16;
if (result != 0)
{
    // do what you need to when that bit is set
}
1 голос
/ 09 ноября 2011

Дополнительно, но, возможно, не лучше, вы можете использовать структуру BitVector32 .

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