老实说,这是一个我无法完成的功课。 任务是使用单个字节处理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比特。 我想过使用添加,但其余的会改变左边的位。 我只能在最有意义的位上使用这个技巧,其中休息没有后果。
private void checkBox8_CheckedChanged(object sender, EventArgs e)
{
flags2 += 0x80;
}
对于其他位,我真的可以使用一些帮助。
答案 0 :(得分: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;
答案 1 :(得分:1)
你必须反转位掩码:
flags &= ~0x10
将第4位(0x10)设置为0
~
运算符反转所有位(8位示例):
0x10 (0001000)
~0x10 (1110111)
要切换一下,请使用此(xor):
flags ^= 0x10
如果您想使用位操作,则使用附加功能
对于练习,我建议将所有数字写为位掩码:
0x10 = 0001000
(基数2)
答案 2 :(得分: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;
答案 3 :(得分: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);