第一次发布,希望这还不错。我已经搜寻了很多东西,以找到一种简单的方法(例如在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#确实支持具有显式布局的重叠结构,但它不支持单个位级别的结构。因此,您最好的选择可能是使用位运算。这不一定很费力:
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];
您可以使用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();