我的意思是:想象一下,我们有一个8字节变量,具有高值和低值。我可以使一个指针指向高4字节,其他指向低4字节,并设置/检索它们的值没有问题。现在,有没有办法获取/设置小于一个字节的值?如果不是将它分成两个4字节的“变量”,我想要考虑八个1字节变量,我可以使用bool,但c#中没有定义的较小变量。是否可以用指针将它分成16?甚至在32,64?这不对吗?
这是一个非常学术性的问题,我知道这可以通过bitshiffting,联盟(Struct.Explicit)等来实现。谢谢!
答案 0 :(得分:2)
不,C#不支持位字段,字节是可寻址内存的最小量。您可以手动提供更改一个或多个特定位的属性,但您必须自己提供打包/解包逻辑:
public bool Bit5 {
get { return (field & 32) != 0; }
set { if (value) field |= 32; else field &= ~32; }
}
顺便说一下,我不知道你是如何使用LayoutKind.Explicit
实现它的,因为你可以指定的最小FieldOffset
是一个字节。
作为旁注,即使是能够通过位字段执行此操作的C ++,也只是隐藏按位技巧,并使编译器代替您执行此操作。你无法从内存中获取少于一个字节的内容到寄存器,至少在x86架构上是这样。