【问题标题】:C# Creating 8-bit binary number and bit manipulationC# 创建 8 位二进制数和位操作
【发布时间】: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# 比较陌生,所以我不确定如何有效地解决这个问题。我总是可以暴力破解它,但我想避免这种情况,因为我们将把这个软件移植到许多可能有不同端口的定制机器上。

【问题讨论】:

    标签: c# .net io bit-manipulation


    【解决方案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;
      

      【讨论】:

      • 这似乎总是发生,但在花了大约一个小时试图弄清楚并在这里提出问题后,我能够找到解决方案,基本上就是你的答案。我可以单独切换每一位,这解决了我的问题!谢谢!
      猜你喜欢
      • 2018-11-07
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2018-09-15
      • 2012-03-13
      相关资源
      最近更新 更多