Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 如何翻转单个位的值?_Winforms_Bit Manipulation_Bitwise Operators - Fatal编程技术网

Winforms 如何翻转单个位的值?

Winforms 如何翻转单个位的值?,winforms,bit-manipulation,bitwise-operators,Winforms,Bit Manipulation,Bitwise Operators,老实说,这是我做不完的家庭作业。 任务是使用单个字节处理8个不同的复选框。 包含复选框的表单的构造函数将一个字节作为输入,并根据输入将复选框设置为选中。 然后,标志字节存储在某个位置,之后每次有一个复选框的状态从选中更改为未选中,从未选中更改为选中,我必须相应地更改标志字节。 到目前为止,我只能完成第一部分: public Form1(byte flags) { InitializeComponent(); flags2 = flags; if ((flags &

老实说,这是我做不完的家庭作业。 任务是使用单个字节处理8个不同的复选框。 包含复选框的表单的构造函数将一个字节作为输入,并根据输入将复选框设置为选中。 然后,标志字节存储在某个位置,之后每次有一个复选框的状态从选中更改为未选中,从未选中更改为选中,我必须相应地更改标志字节。 到目前为止,我只能完成第一部分:

public Form1(byte flags)
{
    InitializeComponent();
    flags2 = flags;
    if ((flags & 0x01) >> 0 != 0) checkBox1.Checked = true; 
    if ((flags & 0x02) >> 1 != 0) checkBox2.Checked = true; 
    if ((flags & 0x04) >> 2 != 0) checkBox3.Checked = true; 
    if ((flags & 0x08) >> 3 != 0) checkBox4.Checked = true; 
    if ((flags & 0x10) >> 4 != 0) checkBox4.Checked = true;
    if ((flags & 0x20) >> 5 != 0) checkBox6.Checked = true; 
    if ((flags & 0x40) >> 6 != 0) checkBox7.Checked = true;
    if ((flags & 0x80) >> 7 != 0) checkBox8.Checked = true; 
}    
但我真的不知道如何做一个不只是一点。 我曾考虑过使用加法器,但其余的会将位改为左边。 我只能在休息没有后果的最有意义的地方使用这个技巧

private void checkBox8_CheckedChanged(object sender, EventArgs e)
{
    flags2 += 0x80;
}       

对于其他位,我真的需要一些帮助。

您必须反转位掩码:

标志&=~0x10

将位4 0x10设置为0。 ~运算符反转所有位8位示例:

 0x10 (0001000)
~0x10 (1110111)
要切换位,请使用此异或:

标志^=0x10

如果您想使用位操作,则使用加法永远不会起作用。 为便于练习,我建议将所有数字记为位掩码:
0x10=0001000基2必须反转位掩码:

标志&=~0x10

将位4 0x10设置为0。 ~运算符反转所有位8位示例:

 0x10 (0001000)
~0x10 (1110111)
要切换位,请使用此异或:

标志^=0x10

如果您想使用位操作,则使用加法永远不会起作用。 为便于练习,我建议将所有数字记为位掩码:
0x10=0001000基2要切换位,请使用异或运算符^:

要清除位,请使用AND运算符和NOT运算符~


要切换位,请使用异或运算符^:

要清除位,请使用AND运算符和NOT运算符~


此外,您还可以简化初始化代码:

checkBox1.Checked = ((flags & 0x01) != 0);
checkBox2.Checked = ((flags & 0x02) != 0);
checkBox3.Checked = ((flags & 0x04) != 0);
checkBox4.Checked = ((flags & 0x08) != 0);
checkBox5.Checked = ((flags & 0x10) != 0);
checkBox6.Checked = ((flags & 0x20) != 0);
checkBox7.Checked = ((flags & 0x40) != 0);
checkBox8.Checked = ((flags & 0x80) != 0);

此外,您还可以简化初始化代码:

checkBox1.Checked = ((flags & 0x01) != 0);
checkBox2.Checked = ((flags & 0x02) != 0);
checkBox3.Checked = ((flags & 0x04) != 0);
checkBox4.Checked = ((flags & 0x08) != 0);
checkBox5.Checked = ((flags & 0x10) != 0);
checkBox6.Checked = ((flags & 0x20) != 0);
checkBox7.Checked = ((flags & 0x40) != 0);
checkBox8.Checked = ((flags & 0x80) != 0);

假设存储初始状态的变量为flags2,则

private void CheckBox1_CheckedChanged(Object sender, EventArgs e) 
{
   if(checkBox1.Checked)
       flags2 |= 1;
   else
       flags2 &= ~0xFE; 

   // ~0x2=0xFD, ~0x4=0xFB, ~0x08=0xF7, 
   // ~0x10=0xF5, ~0x20=0xEB, ~0x40=0xD7, ~0x80=0xAF
}
还要注意,您的初始测试可以简单地重写为

if ((flags & 0x04) != 0) checkBox1.Checked = true; 

假设存储初始状态的变量为flags2,则

private void CheckBox1_CheckedChanged(Object sender, EventArgs e) 
{
   if(checkBox1.Checked)
       flags2 |= 1;
   else
       flags2 &= ~0xFE; 

   // ~0x2=0xFD, ~0x4=0xFB, ~0x08=0xF7, 
   // ~0x10=0xF5, ~0x20=0xEB, ~0x40=0xD7, ~0x80=0xAF
}
还要注意,您的初始测试可以简单地重写为

if ((flags & 0x04) != 0) checkBox1.Checked = true; 

现在测试一下,我会让你知道它是否有效。编辑:不起作用,~运算符只能用于一个字节:/~运算符是为任何整数字节、短整数、整数定义的,…如果使用位,加法有时会起作用。。当然,如果您想要不带进位的xor或aka加法,则不需要这样做。但例如,x&x-1减法是一种加法形式,用于删除最右边的1,以及其他一些涉及最右边位的表达式,在位向量上使用加法或减法是有意义的。@harold:您完全正确。我觉得这很危险,因为你只能加减一次。在大多数情况下,我只设置或清除一个位,不管设置或清除的频率有多高,所以位操作是安全的。我不确定是否与我所说的相符,但可以肯定的是,添加并不是设置位的好方法。例如,标识x | y==x&~y+y不是很有用,因为它需要更多的操作。现在测试它,我会让你知道它是否有效。编辑:不起作用,~运算符只能用于一个字节:/~运算符是为任何整数字节、短整数、整数定义的,…如果使用位,加法有时会起作用。。当然,如果您想要不带进位的xor或aka加法,则不需要这样做。但例如,x&x-1减法是一种加法形式,用于删除最右边的1,以及其他一些涉及最右边位的表达式,在位向量上使用加法或减法是有意义的。@harold:您完全正确。我觉得这很危险,因为你只能加减一次。在大多数情况下,我只设置或清除一个位,不管设置或清除的频率有多高,所以位操作是安全的。我不确定是否与我所说的相符,但可以肯定的是,添加并不是设置位的好方法。例如,标识x | y==x&~y+y不是很有用,因为它需要更多的操作。现在测试这个解决方案,我会让你知道它是否有效,如果加法在两个正位之间,则有一个余数会改变所有的连续位:/嗯,实际上我没有对它进行测试,我不得不这样做,这看起来更像是你的解决方案,而不是乔的。如果复选框1.选中标记2 |=0x01;else-flags2=byteflags2&~0x01;我现在该怎么办?我已经迫不及待地接受了他的回答啊,这是一个很好的例子。这取决于你。如果你觉得另一个答案更好的话,你可以接受它。它每天都在发生。真的,我不确定你的销售代表允许做什么。但是,在任何情况下,当你有足够的重复次数时,你可以更改accept,当然,你也可以随时更新部分有用的答案。现在测试这个解决方案,如果它不起作用,如果加法在两个位置之间,我会让你知道
有一个rest可以改变所有连续的位:/事实上,我没有测试它,我不得不这样做,看起来更像是你的解决方案,而不是joe的。如果复选框1.选中标记2 |=0x01;else-flags2=byteflags2&~0x01;我现在该怎么办?我已经迫不及待地接受了他的回答啊,这是一个很好的例子。这取决于你。如果你觉得另一个答案更好的话,你可以接受它。它每天都在发生。真的,我不确定你的销售代表允许做什么。但是,在任何情况下,当您有足够的重复次数时,您都可以更改accept,当然,您也可以随时更新部分有用的答案