前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS共用体

iOS共用体

作者头像
用户6094182
发布2019-08-23 17:41:16
8750
发布2019-08-23 17:41:16
举报
文章被收录于专栏:joealzhoujoealzhou

iOS共用体

一、何为共用体

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

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

二、使用共用体的好处

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

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

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

代码语言:javascript
复制
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依葫芦画瓢。

代码语言:javascript
复制
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,转为二进制:

代码语言:javascript
复制
5
0b00000101

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

Tips: 位运算符
  • &: 与
  • |: 或
  • !: 非
  • ~: 取反
  • ^: 异或
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.07.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • iOS共用体
    • 一、何为共用体
      • 二、使用共用体的好处
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档