【问题标题】:How to use bit field with Swift to store values with more than 1 bit如何在 Swift 中使用位域来存储超过 1 位的值
【发布时间】:2015-01-18 13:46:30
【问题描述】:

C 中我可以这样做:

struct byte_nibbles {
    unsigned char b1: 4;
    unsigned char b2: 4;
    unsigned char b3: 4;
    unsigned char b4: 4;
    unsigned char b5: 4;
    unsigned char b6: 4;
    unsigned char b7: 4;
    unsigned char b8: 4;
};

union {
    unsigned long var;
    struct byte_nibbles b;
}
u;

int main(void)
{
    u.b.b1=0x01; u.b.b2=0x02; u.b.b3=0x03; u.b.b4=0x04;
    u.b.b5=0x05; u.b.b6=0x06; u.b.b7=0x07; u.b.b8=0x08;
    return 0;
}

所以我可以访问 byte_nibbles 的特定部分。 显然这只是一个例子。可以创建适合基本类型的任何大小的位域。

尽管我付出了很多努力并进行了大量研究,但我还是无法弄清楚如何在 Swift 中做到这一点。我可以使用按位来获得相同的结果,但这并不那么可读和优雅。

有什么想法吗?

【问题讨论】:

    标签: swift struct bit-fields


    【解决方案1】:

    Swift 只是不支持位域,所以你只能

    • 改用下一个更大的整数类型(在您的情况下为Int8)并接受 变量需要更多内存,或者
    • 使用位运算来访问整数的不同部分。

    对于第二种情况,您可以定义自定义 计算属性 以简化 访问。举个例子:

    extension UInt8 {
        var lowNibble : UInt8 {
            get {
                return self & 0x0F
            }
            set(newValue) {
                self = (self & 0xF0) | (newValue & 0x0F)
            }
        }
    
        var highNibble : UInt8 {
            get {
                return (self & 0xF0) >> 4
            }
            set(newValue) {
                self = (self & 0x0F) | ((newValue & 0x0F) << 4)
            }
        }
    }
    
    
    var byte : UInt8 = 0
    byte.lowNibble = 0x01
    byte.highNibble = 0x02
    print(byte.lowNibble)
    print(byte.highNibble)
    

    【讨论】:

    • 我正在编写一个 Chip-8 VM,那么在这种情况下,我必须使用位操作来访问整数的不同部分,就像你说的那样。感谢您的帮助。
    • Martin,Swift 2.1 现在支持位域
    • @dcunited001:如果我没记错的话,从 C 导入的结构中支持位字段,但您不能直接在 Swift 中定义它们。
    • 位域是一种使用二进制操作一次一位地访问存储的基本结构。在硬件接口、通信或仅实现简单但非常有用的状态机中至关重要。无论如何谁设计了这种语言.... :-/.也许他们会在 Swift 5 或 Swift 6 中实现更多的基础
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多