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

标签 c# int unsigned bit-fields

我到处搜索以找到一种简单的方法(例如在 C++ 中)在 C# 中执行此操作,我想我不知 Prop 体的搜索术语。在 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# 确实支持具有显式布局的重叠结构,但它不支持细化到单个位的级别。因此,这里最好的选择可能是使用位运算。这并不一定很困难:

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;

关于c# - 将 16 位无符号整数状态字转换为位数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61069928/

相关文章:

c - 为什么 C 没有无符号 float ?

c# - Visual Studio 2013 Ultimate 与 Microsoft.VisualBasic.PowerPack

c# - 代码有点困惑

c# - web服务中文件下载多线程并发的问题

c# - List<int[]> 仅由 int[] 的最后内容填充

c# - 如何获得枚举的所有可能组合(标志)

Python:查找列表中的所有元素是否都相同,除了恰好 2 个数字

c++ - 使用 stringstream 将 int 解析为字符串

Ruby - 从文件中读取字节,转换为整数