1

老实说, 这是我无法完成的功课。任务是使用单个字节处理 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; 
}    

但我真的不知道如何在 1 位上做一个 not。我考虑过使用加法,但剩下的会改变左边的位。我只能在休息没有影响的最重要的部分使用这个技巧。

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

对于其他位,我真的可以使用一些帮助。

4

4 回答 4

2

要切换位,请使用 XOR 运算符 ( ^):

flags ^= <bits>;   -or-  flags2 = flags ^ <bits>;   -e.g.-  flags ^= 0x04;

要设置位,请使用 OR 运算符 ( |):

flags |= <bits>;   -or-  flags2 = flags | <bits>;   -e.g.-  flags |= 0x08;

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

flags &= ~<bits>;  -or-  flags2 = flags & ~<bits>;  -e.g.-  flags &= ~0x08;
于 2013-05-10T20:53:33.733 回答
1

您必须反转位掩码:

flags &= ~0x10

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

 0x10 (0001000)
~0x10 (1110111)

要切换一点,请使用此(xor):

flags ^= 0x10

如果您想使用位进行操作,则使用加法永远不会奏效。
为了练习,我建议将所有数字写为位掩码:(以 0x10 = 00010002 为底)

于 2013-05-10T20:50:52.273 回答
1

假设您存储初始状态的变量是 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; 
于 2013-05-10T20:56:57.710 回答
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);
于 2013-05-10T20:56:54.607 回答