C# 如何将特定的二进制位设置为 0 或 1?

Posted

技术标签:

【中文标题】C# 如何将特定的二进制位设置为 0 或 1?【英文标题】:C# How do I set specific binary bit to 0 or 1? 【发布时间】:2022-01-11 07:54:39 【问题描述】:

我有四个复选框链接到 0x00 和 0x0F 之间的十六进制值,所以如果您输入 0x0B,即 1011,复选框将被选中,不选中,选中,选中。为此我使用了:

if ((controlByte.Item2 & 0x01) == 0x01)

    control1 = true;

if ((controlByte.Item2 & 0x02) == 0x02)

    control2 = true;

if ((controlByte.Item2 & 0x04) == 0x04)

    control3 = true;

if ((controlByte.Item2 & 0x08) == 0x08)

    control4 = true;

接下来我希望它朝另一个方向发展,所以当你点击复选框时,十六进制值会改变。

如果我有当前值 0x0B (1011) 并单击第一个框,我希望它返回 0x0A (1010)。我的函数将遍历每个复选框并随时更新十六进制值。我当前的尝试如下所示:

if (checkbox1)

    controlbyte = (byte)(controlbyte | 0x01);

else

    controlbyte = (byte)(controlbyte ^ 0x01);

看起来这会切换它,但是当我运行所有复选框时,它会切换我没有点击的复选框。有没有更好的方法来获取 0x0B (1011) 并将其中一个位设置为 0 或 1?

【问题讨论】:

这里的问题是您正在使用 XOR 运算符 ^。您真正需要的是“与”(&)与您要重置的位的按位“非”(~):controlbyte = (byte)(controlbyte & ~0x01); 【参考方案1】:
( 1 << flag ) <--- change like this; 
if ((controlByte.Item2 & (1 << flag)) == (1 << flag))

    control[flag] = true;

//0x01 == 1 << 1;
//0x02 == 1 << 2;
//0x04 == 1 << 3;
//0x08 == 1 << 4;
//because it same like this:

if ((controlByte.Item2 & (1 << 1)) == (1 << 1))

    control1 = true;


if ((controlByte.Item2 & (1 << 2)) == (1 << 2))

    control2 = true;


if ((controlByte.Item2 & (1 << 3)) == (1 << 3))

    control3 = true;

...

controlbyte = (byte)(controlbyte | (1 << 1));

controlbyte = (byte)(controlbyte ^ (1 << 1));

【讨论】:

完美地使用 0 到 3。我不太明白,但非常感谢。

以上是关于C# 如何将特定的二进制位设置为 0 或 1?的主要内容,如果未能解决你的问题,请参考以下文章

如何在未知大小的二进制数中将所有位设置为“1”?

如何将字符串转换为 12 位二进制而不改变它在 asp.net c# 中的值

简简单单学会C#位运算

java的移位和异或运算

求用c#语言写一个将十进制转换为二进制的程序

c#中的位运算