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

问题描述 投票:2回答:2

第一次发布,希望这还不错。我已经搜寻了很多东西,以找到一种简单的方法(例如在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 convert
2个回答
2
投票

虽然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];

0
投票

您可以使用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();
© www.soinside.com 2019 - 2024. All rights reserved.