C# 理解If语句字节运算符
我下载了一些USB控制的继电器开关。我需要为一个应用程序操作这段代码,但是我在理解字节运算符时遇到了困难 我看过位移位运算符,我知道它们将位移位到下一个2的幂。以下是我正在努力解决的功能:C# 理解If语句字节运算符,c#,byte,C#,Byte,我下载了一些USB控制的继电器开关。我需要为一个应用程序操作这段代码,但是我在理解字节运算符时遇到了困难 我看过位移位运算符,我知道它们将位移位到下一个2的幂。以下是我正在努力解决的功能: byte[] SerBuf = new byte[64]; byte states = 0; private void button_pressed(object sender, MouseEventArgs e) { // Check type of sender to
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
}
}
byte[]SerBuf=新字节[64];
字节状态=0;
按下专用无效按钮(对象发送器,鼠标目标e)
{
//检查发送器的类型,确保它是一个按钮
如果(发送者是按钮)
{
如果(usb_found==1)
{
按钮=(按钮)发送器;
//检查我们希望更改的按钮的标题
//然后检查继电器的状态,并发送相应的命令将其打开或关闭
开关(button.Text.ToString())
{
案例“继电器1”:
如果((states&0x01)==0)SerBuf[0]=0x65;//则&
运算符为位和运算符。它逐位比较两个操作数。仅当设置了某个位置的两个位时,才会设置结果中的对应位
因此,假设您有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
当且仅当状态为偶数时才为真,即写入一个以0
结尾的位字符串。请记住0x01
是00000001
写入一个位字符串。和运算符是位和运算符。它将两个操作数逐位进行比较。仅当某个位置的两个位都设置为设置结果中的相应位
因此,假设您有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
。&
是按位“且”.0x01是二进制00000001.((states&0x01)
屏蔽了除第一位以外的所有状态
;因此,如果状态为0x02
(二进制00000010
),((状态&0x01)==0
。如果状态为0x03(二进制00000011
),((状态&0x01)==1
。如果状态为0x07(00000111
),((状态&0x01)==1
。@đěxěŕ我理解0x01
=1。但是如果states=0
和0x01=1
,如何在代码中计算为零?如果状态的最低阶位为1,则状态&0x01返回1,如果状态的最低阶位为0,则返回零。如果状态为0,则所有位都为零,包括该位。这是我的这不是移位操作,而是逻辑操作。出于明显的原因,我们称之为“掩蔽”。(states&0x04)
将查看第三位,因为0x04==二进制00000100。0x06是00000110,因此将查看第二位和第三位。0001100&0000110==0000100--只有在这两个位中都是1的位才能通过表达式。@EdPlunkett感谢您的解释,首先得到它。@EdPlunkett-啊哈!这很有道理!谢谢!&
是按位“和”.0x01是二进制00000001。((状态&0x01)
屏蔽了除第一位以外的所有状态
;因此,如果状态是0x02
(二进制00000010
),((状态&0x01)==0
。如果状态是0x03(二进制00000011
),((状态&0x01)==1
)如果状态是0x07(00000111
),((states&0x01)==1
。@đěxěŕ我理解0x01
=1。但是如果states=0
和0x01=1
,如何在代码中计算为零?如果状态的最低阶位为1,则状态&0x01返回1,如果状态的最低阶位为0,则返回零。如果状态为0,则所有位都为零,包括该位。这是我的这不是移位操作,而是逻辑操作。出于明显的原因,我们称之为“掩蔽”。(states&0x04)
将查看第三位,因为0x04==binary 00000100。0x06是00000110,因此将查看第二位和第三位。0001100&0000110==0000100--只有在这两个位中都是1的位才能通过表达式。@EdPlunkett感谢您的解释,首先得到它。@EdPlunkett-啊哈!这很有道理!谢谢!