iOS共用体

作者: joeal | 来源:发表于2019-07-22 20:06 被阅读4次

    iOS共用体

    一、何为共用体

    在C语言中有union联合体/共用体。

    • union中可以定义多个成员,union的大小由最大的成员的大小决定。
    • union成员共享同一块大小的内存,一次只能使用其中的一个成员。
    • 对某一个成员赋值,会覆盖其他成员的值(也不奇怪,因为他们共享一块内存。但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节)
      联合体
    • union的存放顺序是所有成员都从低地址开始存放的。

    二、使用共用体的好处

    使代码存储数据高效率的同时,有较强的可读性,可以使用共用体来增强代码可读性,同时使用位运算来提高数据存取的效率。

    OC示例可以参考这篇文档。以下是我用swift实现共用体示例。有一个Person类如果要这个类有三个属性:高否、富否、帅否。我们一般是初始化三个Bool类型属性。但是这里我们使用共用体一个属性,1个字节容量完成。三个bool值,我们只要三位bit就能完全表示了。

    我们取一字节最后三位表示,低位到高位依次是:帅、富、高。定义位掩码如下:

    
    let TallMask: UInt8         = 1<<2 // 0b00000100 4
    let RichMask: UInt8         = 1<<1 // 0b00000010 2
    let HandsomeMask: UInt8     = 1<<0 // 0b00000001 1
    class Person {
        //bits末三位存储以上三个bool值信息
        private var bits: UInt8 = 0
        
        func setTall(_ tall: Bool) {
            if tall {
                self.bits |= TallMask
            } else {
                self.bits &= ~TallMask
            }
        }
        
        func tall() -> Bool {
            return (self.bits & TallMask) > 0 ? true : false
        }
        
        //补充setRich rich setHandsome handsome方法
        func description() {
            let t = tall()
            let r = rich()
            let h = handsome()
            debugPrint("tall: \(t) rich: \(r) handsome: \(h) bits: \(bits)")
        }
     }
    

    tall属性如上设置和获取,rich,handsome依葫芦画瓢。

    let p = Person()
    p.setTall(true)
    p.setRich(false)
    p.setHandsome(true)
    p.description()
    
    //==========print=============
    "tall: true rich: false handsome: true bits: 5"
    

    bits值为5,转为二进制:

    5
    0b00000101
    

    后三位101,对应tall=truerich=falsehandsome=true

    Tips: 位运算符
    • &: 与
    • |: 或
    • !: 非
    • ~: 取反
    • ^: 异或

    相关文章

      网友评论

        本文标题:iOS共用体

        本文链接:https://www.haomeiwen.com/subject/ghdglctx.html