iOS 存储方式——位运算

前言:好久不更了,怪自己懒散了,总结一个小功能算是个经验吧,有关存储方案的。
本地存储不仅考虑数据合理性,也要考虑存储压力,权衡利弊实施最适合的方案才是最重要的。

需求描述

需求图片
  • 每个开关控制着一个语音的播报
  • 开关记录存储到本地

功能实现

最简单直接的方法就是存一个model,记录每条数据的状态

{
    "voice": "rabbit",
    "status": 1
}
{
    "voice": "rabbit",
    "status": 0
}
{
    "voice": "rabbit",
    "status": 1
}
{
    "voice": "rabbit",
    "status": 0
}
{
    "voice": "rabbit",
    "status": 1
}
{
    "voice": "rabbit",
    "status": 0
}
{
    "voice": "rabbit",
    "status": 1
}

存储优化

开关状态只有「开/关」,可以想到用「0/1」标识,so灵感来了

  • 每个语音设置一个标志位
  • 每个标志位,0标识关,1标识开
声音种类 标志位 存储值
小萝卜 0b00000001 1
小白菜 0b00000010 2
小土豆 0b00000100 4
小菜椒 0b00001000 8
小南瓜 0b00010000 16
小地瓜 0b00100000 32
小白兔 0b01000000 64

对应视觉图内存储存储结果应该是

二进制 存储值
0b01000011 67

只需要存储一个【数值】,即可标志所有开关的组合,即各类组合值为 「2^N」
「0」表示所有开关关闭; 「127」表示所有开关打开

举个例子🌰:

存储值 小萝卜 小白菜 小土豆 小菜椒 小南瓜 小地瓜 小白兔
0 0 0 0 0 0 0 0
23 0 0 1 0 1 1 1
98 1 1 0 0 0 1 0
127 1 1 1 1 1 1 1

取值设置状态(按位与)

开关状态 = 预存值 & 标志位

开关状态 = 0b 01000011(预存值) & 0b00000100(小土豆) = 0(关)

小土豆的状态

语音置开(按位或)

语音置开 = 预存值 | 标志位

语音置开 = 0b 01000011(预存值) | 0b00000100(小土豆) = 0b 01000111(新预存值=71)

小土豆打开开关

语音置关(按位异或)

语音置关 = 预存值 ^ 标志位
异或【^】:同为0、异为1

语音置关闭 = 0b 01000011(预存值) ^ 0b01000000(小白兔) = 0b 00000011(新预存值=3)

小白兔关闭开关

TODO

如果后续增加语音开关,只需要增加相关标志值即可,其他逻辑不需要修改
但枚举值必须满足「2^N」

Swift 对位运算兼容不是很友好,用十进制数字位运算也能达到效果。

总结

存储结构由一个model变成了一个数字,虽然在取值赋值操作逻辑稍微繁琐了一些,但降低了存储数据的量级,直接避免了I/O 操作,也算是特殊场景存储的最佳方案了。

蛮想念那个曾经我爱不释手的离散数学课

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,732评论 2 9
  • 什么是相处不累的婚姻? 最高赞的一条回答就是:嫁给你,我温暖而幸福;而你刚好是带给我幸福的那个人。我能给予你想要的...
    金指尖的花园阅读 252评论 0 2
  • 小学一年级阶段是儿童形成各种习惯的最佳时期。在这一阶段重视培养良好的学习习惯,不仅直接影响学生的学习成绩,...
    紫色丁香2012阅读 98评论 0 0
  • 继续逃学,育红班的教室是同学家凉土胚的茅草屋,有一块拿墨汁染的小木板作黑板,每天上学拎个小马扎,穿过大半个村子,对...
    原子曰阅读 185评论 1 0
  • Cubes是一个轻量级Python框架,包含OLAP、多维数据分析和浏览聚合数据(aggregated data)...
    1eb034fb5715阅读 155评论 0 2