Понимание операторов байта оператора - PullRequest
0 голосов
/ 01 мая 2019

Я скачал исходный код для управляемого реле USB. Мне нужно манипулировать этим кодом для приложения, но у меня возникают проблемы с пониманием байтовых операторов.

Я посмотрел на операторов сдвига битов и понимаю, что они сдвигают биты до следующей степени 2. Ниже приведена функция, с которой я борюсь:

byte[] SerBuf = new byte[64];
byte states = 0;
private void button_pressed(object sender, MouseEventArgs e)
       {
           // Check type of sender to make sure it is a button
           if (sender is Button)
           {
               if (usb_found == 1)
               {
                   Button button = (Button)sender;
                   // Check the title of the button for which realy we wish to change
                   // And then check the state of that relay and send the appropriate command to turn it on or off
                   switch (button.Text.ToString())
                   {
                       case "Relay 1":
                           if ((states & 0x01) == 0) SerBuf[0] = 0x65; //<this is the bit I don't understand
                           else SerBuf[0] = 0x6F;
                           //Thread.Sleep(2000);
                           break;
                       case "Relay 2":
                           if ((states & (0x01 << 1)) == 0) SerBuf[0] = 0x66; //<this is the bit I don't understand
                           else SerBuf[0] = 0x70;
                           break;
                       case "Both":
                           SerBuf[0] = 0x64;
                           break;
                       case "None":
                           SerBuf[0] = 0x6E;
                           break;
                   }
                   transmit(1); // this sends the new buffer to the relay board

               }
           }

Что я не понимаю, так это то, что оценивается с if ((states & 0x01) == 0)

Байт States находится в диапазоне от 0 до 3 в зависимости от того, какой из двух релейных переключателей активен.

Что делает 0x01?

1 Ответ

2 голосов
/ 01 мая 2019

Оператор & является битовым оператором. Он сравнивает оба операнда по крупицам. Только если оба бита в позиции установлены, соответствующий бит в результате устанавливается.

Допустим, у вас есть a и b, где a представлен как битовая строка 00001101 и b как 00001011. Тогда a & b записывается как битовая строка 00001001, потому что

           +----- no bit is set
           |+---- both bits are set
           ||+--- only one bit is set  
           |||+-- only one bit is set  
           ||||+- both bits are set
           vvvvv
a     = 00001101
b     = 00001011
----------------
a & b = 00001001

Другими словами, (states & 0x01) == 0 истинно тогда и только тогда, когда states является четным, то есть записывается как битовая строка и заканчивается 0. Помните, что 0x01 - это 00000001, записанный в виде битовой строки.

...