【问题标题】:Convert 16-bit unsigned integer status word to bitarray将 16 位无符号整数状态字转换为位数组
【发布时间】:2020-07-19 01:10:41
【问题描述】:

我搜索了高和低以找到一种简单的方法(如在 C++ 中)在 C# 中执行此操作,我想我不知道具体的搜索词。在 C++ 中,我使用下面的代码放入一个 16 位无符号整数,然后我可以使用它轻松获取各个位。我如何在 C# 中做到这一点?我尝试了BitArray,但它似乎没有提供一种方法来输入一个无符号的 16 位值然后获取位。也许BitArray 不是办法。

使用这种方式,我可以从我的设备(步进电机)读取状态寄存器值,将此值分配给位域,无需额外代码即可轻松访问其中的位。

非常感谢您的帮助。

typedef union bitfield16_union
{
    U16 uiWord;    // unsigned short
    struct
    {
        unsigned short    b0 : 1;      // LSB
        unsigned short    b1 : 1;
        unsigned short    b2 : 1;
        unsigned short    b3 : 1;
        unsigned short    b4 : 1;
        unsigned short    b5 : 1;
        unsigned short    b6 : 1;
        unsigned short    b7 : 1;
        unsigned short    b8 : 1;
        unsigned short    b9 : 1;
        unsigned short    b10 : 1;
        unsigned short    b11 : 1;
        unsigned short    b12 : 1;
        unsigned short    b13 : 1;
        unsigned short    b14 : 1;
        unsigned short    b15 : 1;      // MSB
    } b;
    // ************
} BITFIELD16;
// ************


main
{ 
BITFIELD16 statusWord;

statusWord.uiWord = 154;
if(statusWord.b.b3) {do something}
} 

【问题讨论】:

标签: c# int unsigned bit-fields


【解决方案1】:

虽然 C# 确实支持具有显式布局的重叠结构,但它不支持到单个位的级别。因此,您最好的选择可能是使用位操作。这不一定是艰巨的:

public ushort Value { get; set; }
public bool this[int index] {
    get => (Value & (1 << index)) != 0;
    set {
        if (value) Value |= (ushort)(1 << index);
        else Value &= (ushort)~(1 << index);
    }
} // Note untested

用法:

bool b3 = thing[3];
thing[5] = false;

【讨论】:

    【解决方案2】:

    您可以使用 Convert.ToString() 将 uint32 转换为其二进制字符串表示形式。

    uint32 someNumber = 16384;
    string binaryString = Convert.ToString(someNumber, 2);
    

    您可以从那里使用Select 创建一个布尔数组。

    bool[] bits = binaryString.Select( x => x == '1' ).ToArray();
    

    根据您希望如何索引位数组,您可能需要反转它。反转它意味着最低有效位将位于索引 0:

    bool[] bits = binaryString.Reverse().Select( x => x == '1' ).ToArray();
    

    【讨论】:

      猜你喜欢
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多