C# 创建 8 位二进制数和位操作

C# Creating 8-bit binary number and bit manipulation

我正在用 C# 创建一个 WPF 程序,它将与 I/O 板对话。为了将数据写入 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 板将不会保持第一个信号与第二个信号同时打开,而是禁用信号,因为数据写入方式的绝对性质。我希望能够看到一些东西,在那里我可以只拥有一个变量 hold 1111 1111 并且我可以在它的位置修改一个位,这样我就可以打开多个输出信号。我对 C# 比较陌生,所以我不确定如何有效地解决这个问题。我总是可以暴力破解它,但我想避免这种情况,因为我们会将此软件移植到许多可能具有不同端口等的自定义机器上。

您应该熟悉二元运算符 (| & ^) 例如,您可以通过与 00000001 异或来切换数字的最低有效位:

x = x ^ 0b00000001;

下面的应用程序使用位掩码来设置或清除位。

您可以使用 visual studio 创建一个新的控制台应用程序项目,然后剪切并粘贴下面的代码。

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