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 位二进制数和位操作的主要内容,如果未能解决你的问题,请参考以下文章

字和字节和位的关系

位操作符和位运算

二进制和位运算中的异或

位和位模式

进制转换函数和位运算

逻辑运算和位运算