Побитовое сравнение

309
11 ноября 2017, 10:39

Объясните пожалуйста на пальцах. У меня есть маска в двоичном представлении 0000 0100, я хочу во время когда пользователь вводит число, например : 4 что в двоичном равно маске, получать true, во всех остальных случаях false. Делаю вот так :

public static bool isTrue(byte num)
{
    byte result = (byte)(num & MASK_DAY); //Константа = 0x04;
    if(result == 0)
    {
        return false;
    }
    return true;
}  

В этом случае я получаю всегда true когда бит другого числа, 2 разряда, равен 1, а как мне сделать что бы я получал true только тогда когда 2-е разряды обоих чисел совпадают, а все остальное равно 0? Или я не правильно понимаю работу с битами?

Answer 1

Битовые маски применяются для того, чтобы проверить в числе только интересующие нас биты. А на остальные не обращать внимания.

Например:

  • проверка, что в числе установлены те биты, которые установлены в MASK_DAY. Значение остальных бит нас не интересует

    if (num & MASK_DAY == MASK_DAY)
  • в числе не установлены те биты, которые установлены в MASK_DAY

    if (num & MASK_DAY == 0)
  • проверка, что все не установленные биты MASK_DAY сброшены и в num

    if (num | MASK_DAY == MASK_DAY)
  • проверка, что все установленные биты MASK_DAY установлены и в num, а не установленные - сброшены

    if (num == MASK_DAY)
Answer 2

Повторять уже написанное не буду, но некоторые уточнения внесу.

1. Битовые (поразрядные) операции в качестве результата возвращают число.

это означает, что если вы, например, выполнили операцию

byte res = 0x04 & 0x0f
00000100 //0x04 
&&&&&&&&  
00001111 //0x0f
========  
00000100 //0x04

то переменная res будет содержать 0x04

2. В C# в условном операторе if допустимы только логические выражения

Это означает, что мы не можем использовать результат поразрядной операции (число) в качестве условия для if, поэтому нам необходимо использовать логическую (результат типа bool [true/false]) операцию сравнения == для проверки, что после применения поразрядной операции получилось нужное число.

В большинстве случаев достаточно простых логических операций сравнения. Битовые операции имеет смысл использовать тогда, и только тогда, когда вас интересует состояние конкретных бит в числе, например в случае упаковки нескольких логических переменных в одно число с целью экстремальной экономии памяти.

READ ALSO
как использовать мьютекс (Mutex)

как использовать мьютекс (Mutex)

Не могу разобраться как добавить мьютекс,в форме есть 6 pictureBox-ов, каждые t секунды меняет цвет первой части, в ответ на изменение цвета в первой...

260
Assembly interpreter code на С#

Assembly interpreter code на С#

Я пишу assembly interpreter code в C#

298
Как правильно создавать объекты?

Как правильно создавать объекты?

Слышал что не рекомендуется использовать оператор new где попалоЕго необходимо изолировать в отдельном классе который будет отвечать за создания...

253
Свойства-расширения в C#

Свойства-расширения в C#

Возможно ли сделать свойство-расширение для класса? Например у меня есть такой метод-расширение:

229