如何优雅地运用位运算实现产品需求

栏目: IT技术 · 发布时间: 4年前

点击上方“ 服务端思维 ”,选择“ 设为星标

回复” 669 “获取独家整理的精选资料集

回复” 加群 “加入全国服务端高端社群「后端圈」

如何优雅地运用位运算实现产品需求

作者 | 梁桂钊

出品 | 服务端思维

在开始正文之前,我们先来说一下 Linux 的系统权限设计。在 Linux 系统中,为了保证文件的安全,对文件所有者、同组用户、其他用户的访问权限进行了分别管理。其中,文件所有者,即建立文件或目录的用户。同组用户,是所属组群中的所有用户。其他用户,指的是既不是文件所有者,也不是同组用户的其他用户。每个文件和目录都具有读取权限、写入权限和执行权限,这三个权限之间相互独立。

如何优雅地运用位运算实现产品需求

在 Linux 系统中,每个文件的访问权限可以用 9 个字母表示,每 3 个字母表示一类用户权限,分别代表文件创建者、同组用户、其他用户。其中,r 表示读取权限,w 表示写入权限,x 表示执行权限。通过功能模式修改文件权限,有三个部分组成,包括对象、操作和权限。

如何优雅地运用位运算实现产品需求

假设需要增加同组用户写入权限,下面来看一个例子。

此外,每一类用户的访问也可以通过数字的方式进行表示。

如何优雅地运用位运算实现产品需求

那么,通过数字模式就可以对常见的 Linux 文件权限操作进行归纳。

如何优雅地运用位运算实现产品需求

假设需要设置创建者可读可写可执行、同组用户可读、其他用户可读,我们可以这样写:

事实上,Linux 的文件访问权限就是非常经典的位运算使用场景。无独有偶,我们再来看下 Java 中的 java.lang.reflect.Modifier 。其中, Modifier 类采用 16 进制定义了静态常量。 

如何优雅地运用位运算实现产品需求

紧接着, Modifier 类提供了很多静态方法,例如 isPublic() 方法的返回值 &PUBLIC 对应的 16 进制值,如果非 0,则说明含有 public 修饰符。

如何优雅地运用位运算实现产品需求

这里有一个重要的知 识点,采用 & 运算,两位同时为 1,结果才为 1,否则为 0。 即 0&0=0; 0&1=0; 1&0=0; 1&1=1。 例如: 3&1  即 0000 0 011 & 0000 0001 = 00000001,值为 1。

如何优雅地运用位运算实现产品需求

与此同时, Modifier 类还采用 | 运算,确保参加运算的两个对象只要有一个为 1,其值为 1。即 0|0=0;0|1=1;1|0=1;1|1=1。例如 Modifier.PUBLIC | Modifier.PROTECTED  | Modifier.PRIVATE | Modifier.ABSTRACT       | Modifier.STATIC | Modifier.FINAL | Modifier.STRICT 的结果是 3103,即 110000011111。

如何优雅地运用位运算实现产品需求

书归正传,我们站在前辈们的肩上,通过位运算设计优雅的多选标识,例如通过位运算实现权限控制或多状态管理,它的好处在于易扩展,避免数据库设计过程中字段膨胀,减少磁盘存储空间。

假设,我们现在有一个有一个业务需求:在任务中添加一个通知方式,可选项包括 IM 消息、系统提醒、邮箱、短信。选择 IM 消息后,支持 IM 即时发送;选择系统提醒后,支持站内信推送;选择选择邮箱后,该任务后续相关提醒内容,可通过发送邮件至相关人邮箱中进行通知;选择短信后,该任务后续相关提醒内容,可通过发送短信至相关人进行通知。

如何优雅地运用位运算实现产品需求 我们在设计数据库库表时,通常情况下,将多个标识字段合并成一个字段,并把这个字段改成字符串型方式保存,例如,存在 1 时表示支持 IM,2 时表示支持系统消息,3 表示支持邮箱,4 表示支持短信。此时,如果同时都满足,它的存储形式就是以逗号分隔的字符串:“1,2,3,4”。这样设计的好处在于,不仅消除相同字段的冗余,而且当增加新的渠道类别时,不需增加新的字段。

如何优雅地运用位运算实现产品需求

但在数据查询时,我们需要对字符串进行分隔。并且字符串类型的字段在查询效率和存储空间上不如整型字段。因此,我们可以用“位”来解决这个问题。我们采取不同的位来分别表示不同类别的标识字段。

如何优雅地运用位运算实现产品需求

因此,当某个任务支持 IM 时,则保存 1(0000 0001);支持系统消息时,则保存 2(0000 0010),支持邮箱时,则保存 4(0000 0100);支持短信时,则保存 8(0000 1000)。四种都支持,则保存 15 (0000 11111)。

如何优雅地运用位运算实现产品需求

紧接着,我们通过封装常用方法来实现增删改。

如何优雅地运用位运算实现产品需求

— 新书出版 —

新书出版

如何优雅地运用位运算实现产品需求

如何优雅地运用位运算实现产品需求

— 知识星球 —

加入「面试研习社」星球,心动不如行动,目前优惠活动: 早鸟用户(现价 79¥/年, 原价 99 ¥/年

  • 早鸟用户将享受推广期限时折扣,请及时关注当前的最新优惠活动。

  • 支持 3 天无理由退款。

  • 优惠在 7 月 17 日晚 20:00 整开放,持续一周。

    如何优雅地运用位运算实现产品需求

— 本文结束 —

漫谈设计模式在 Spring 框架中的良好实践

颠覆微服务认知: 深入思考微服务的七个主流观点

人人都是 API 设计者

一文讲透微服务下如何保证事务的一致性

要黑盒测试微服务内部服务间调用,我该如何实现?

如何优雅地运用位运算实现产品需求

关注我,回复 「加群」 加入各种主题讨论群。

对「服务端思维」有期待,请在文末点个 在看

喜欢这篇文章,欢迎 转发、分享 朋友圈

在看点这里

如何优雅地运用位运算实现产品需求

以上所述就是小编给大家介绍的《如何优雅地运用位运算实现产品需求》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTML 5实战

HTML 5实战

陶国荣 / 机械工业出版社 / 2011-11 / 59.00元

陶国荣编著的《HTML5实战》是一本系统而全面的HTML 5教程,根据HTML 5标准的最新草案,系统地对HTML 5的所有重要知识点进行了全面的讲解。在写作方式上,本书以一种开创性的方式使理论与实践达到极好的平衡,不仅对理论知识进行了清晰而透彻的阐述,而且根据读者理解这些知识的需要,精心设计了106个完整(每个案例分为功能描述、实现代码、效果展示和代码分析4个部分)的实战案例,旨在帮助读者通过实......一起来看看 《HTML 5实战》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码