如何翻转单个位的值?

时间:2013-05-10 20:44:10

标签: winforms bit-manipulation bitwise-operators

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

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

4 个答案:

答案 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);