C# 创建 8 位二进制数和位操作
Posted
技术标签:
【中文标题】C# 创建 8 位二进制数和位操作【英文标题】:C# Creating 8-bit binary number and bit manipulation 【发布时间】:2021-02-11 05:40:20 【问题描述】:我正在使用 C# 创建一个与 I/O 板通信的 WPF 程序。为了将数据写入 I/O 板,我需要传递一个 8 位二进制数(1111 1111 表示所有 8 个输出端口都“关闭”,而 0000 0000 表示所有 8 个输出端口都“打开”)。我有复选框,通过以 8 位数字的形式写入数据来切换这些输出端口。这是我当前代码的示例:
private void sol1_Checked(object sender, RoutedEventArgs e)
switch (io_boards_list.SelectedIndex)
case 0:
if (sol2.IsChecked == true)
USBIOBoards.io_boards.WritePort(0, 16, 0xFC); // 1111 1100
else
USBIOBoards.io_boards.WritePort(0, 16, 0xFE); // 1111 1110
break;
private void sol1_Unchecked(object sender, RoutedEventArgs e)
// 1111 1111
switch (io_boards_list.SelectedIndex)
case 0:
if (sol2.IsChecked == true)
USBIOBoards.io_boards.WritePort(0, 16, 0xFD); // 1111 1101
else
USBIOBoards.io_boards.WritePort(0, 16, 0xFE); // 1111 1111
break;
现在的问题是,如果我先勾选第一个复选框,然后勾选第二个复选框,I/O 板将不会将第一个信号与第二个保持一致,而是禁用该信号,因为数据是如何写入的。我希望能够看到一些东西,我可以只拥有一个变量保持 1111 1111 并且我可以在其位置修改一个位,以便我可以打开多个输出信号。我对 C# 比较陌生,所以我不确定如何有效地解决这个问题。我总是可以暴力破解它,但我想避免这种情况,因为我们将把这个软件移植到许多可能有不同端口的定制机器上。
【问题讨论】:
【参考方案1】:下面的应用程序使用位掩码来设置或清除位。
您可以使用visual studio创建一个新的Console Application项目并剪切并粘贴下面的代码。
using System;
namespace Bitmanipulation
class Program
static void Main(string[] args)
int value = 0;
for (int i = 0; i < 8; i++)
Console.WriteLine($"Convert.ToString(value, toBase: 2),8");
value = value.SetBit(i, true);
for (int i = 7; i >= 0; i--)
value = value.SetBit(i, false);
Console.WriteLine($"Convert.ToString(value, toBase: 2),8");
Console.ReadKey();
public static class BitManipulation
/// <summary>
/// Extension method
/// Sets or clears a bit in a value
/// The pos = a zero base position in the value counted from the right
/// </summary>
public static int SetBit(this int val, int pos, bool onoff)
// Shift a bit to the position you want to set or clear
int mask = 1 << pos;
// Depending on set or clearing use the mask or a reversed one
mask = onoff ? mask : 0x7fffffff ^ mask;
// Depending on set of clearing do a bitwise OR or AND
return onoff ? val | mask : val & mask;
应用程序的输出:
0
1
11
111
1111
11111
111111
1111111
1111111
111111
11111
1111
111
11
1
0
【讨论】:
【参考方案2】:您应该熟悉二元运算符 (| & ^) 例如,您可以通过与 00000001 异或来切换数字的最低有效位:
x = x ^ 0b00000001;
【讨论】:
这似乎总是发生,但在花了大约一个小时试图弄清楚并在这里提出问题后,我能够找到解决方案,基本上就是你的答案。我可以单独切换每一位,这解决了我的问题!谢谢!以上是关于C# 创建 8 位二进制数和位操作的主要内容,如果未能解决你的问题,请参考以下文章