繁体   English   中英

将 16 位无符号 integer 状态字转换为位数组

[英]Convert 16-bit unsigned integer status word to bitarray

我在 C# 中搜索了高低以找到一种简单的方法(如在 C++ 中),我想我不知道具体的搜索词。 在 C++ 中,我使用下面的代码放入 16 位无符号 integer,然后我可以使用它轻松获取各个位。 如何在 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# 确实支持具有显式布局的重叠结构,但它不支持单个位的级别。 因此,您最好的选择可能是使用位操作。 这不一定是艰巨的:

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;

您可以使用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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM