swift - 如何在 Swift 中使用位域来存储超过 1 位的值

标签 swift struct bit-fields

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 中做到这一点。我可以使用 bitwise 来获得相同的结果,但这不是可读性和优雅的。

有什么想法吗?

最佳答案

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)

关于swift - 如何在 Swift 中使用位域来存储超过 1 位的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010363/

相关文章:

inheritance - 以另一个接口(interface)的形式实现一个接口(interface)

c - 结构成员的奇怪值

c - 在 C 中使用 unsigned int 位域结构时出错

ios - 如何让 UISearchController 与 UISearchBar Interface Builder 控件一起工作?

arrays - 如何从 C 函数返回 C 结构数组?

c - 是否允许在位字段中使用short或任何其他类型代替int

c - 带符号的位域至少需要两位

ios - 向下滑动时未检测到表单

ios - 具有渐变的 UITableViewCell 在第一次重用单元格之前不起作用

ios - 从 plist 加载数据到 UITableView 时模拟器崩溃