Проверка, установлен ли бит или нет - PullRequest
52 голосов
/ 12 марта 2010

Как проверить, установлен ли определенный бит в байте?

bool IsBitSet(Byte b,byte nPos)
{
   return .....;
}

Ответы [ 9 ]

133 голосов
/ 12 марта 2010

звучит немного как домашнее задание, но:

bool IsBitSet(byte b, int pos)
{
   return (b & (1 << pos)) != 0;
}

позиция 0 - младший бит, позиция 7 - самая большая.

11 голосов
/ 14 мая 2013

Основываясь на ответе Марио Фернандеса , я подумал, почему бы не использовать его в своем наборе инструментов в качестве удобного метода расширения, не ограниченного типом данных, поэтому я надеюсь, что можно поделиться им здесь:

/// <summary>
/// Returns whether the bit at the specified position is set.
/// </summary>
/// <typeparam name="T">Any integer type.</typeparam>
/// <param name="t">The value to check.</param>
/// <param name="pos">
/// The position of the bit to check, 0 refers to the least significant bit.
/// </param>
/// <returns>true if the specified bit is on, otherwise false.</returns>
public static bool IsBitSet<T>(this T t, int pos) where T : struct, IConvertible
{
 var value = t.ToInt64(CultureInfo.CurrentCulture);
 return (value & (1 << pos)) != 0;
}
5 голосов
/ 14 мая 2011

Это также работает (протестировано в .NET 4):

void Main()
{
    //0x05 = 101b
    Console.WriteLine(IsBitSet(0x05, 0)); //True
    Console.WriteLine(IsBitSet(0x05, 1)); //False
    Console.WriteLine(IsBitSet(0x05, 2)); //True
}

bool IsBitSet(byte b, byte nPos){
    return new BitArray(new[]{b})[nPos];
}
5 голосов
/ 12 марта 2010

Вот решение в словах.

Сдвиньте влево целое число с начальным значением 1 n раз, а затем выполните AND с исходным байтом. Если результат не равен нулю, бит устанавливается в противном случае нет. :)

4 голосов
/ 12 марта 2010

Сдвиньте вправо введенные n битов и замаскируйте их на 1, затем проверьте, есть ли у вас 0 или 1.

1 голос
/ 17 февраля 2018

Эквивалентен коду Mario F, но смещает байт вместо маски:

bool IsBitSet(byte b, int pos)
{
   return ((b >> pos) & 1) != 0;
}
0 голосов
/ 28 июля 2012
x == (x | Math.Pow(2, y));

int x = 5;

x == (x | Math.Pow(2, 0) //Bit 0 is ON;
x == (x | Math.Pow(2, 1) //Bit 1 is OFF;
x == (x | Math.Pow(2, 2) //Bit 2 is ON;
0 голосов
/ 09 мая 2012

Чтобы проверить биты в 16-битном слове:

  Int16 WordVal = 16;
  for (int i = 0; i < 15; i++)
  {
     bitVal = (short) ((WordVal >> i) & 0x1);
     sL = String.Format("Bit #{0:d} = {1:d}", i, bitVal);
     Console.WriteLine(sL);
  }
0 голосов
/ 12 марта 2010

что-то вроде

return ((0x1 << nPos) & b) != 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...