&运算常用场景总结

在实际开发场景中, 有时候&运算能实现特殊业务场景.达到简化设计高内聚效果.

1. hash重定向

场景:
对于key-value数据结构Node, 考虑List<Node>如何实现Node均衡分布, 查找时间复杂度为O(1).
实现:

  1. List底层使用Array数组实现(查找为O(1)), 特殊地Array大小保持2n的幂(扩容时n会变化).
  2. add添加元素时, 对key进行Hash运算;
  3. 再根据Hash运算结果和容器大小size-1,进行&运算, 定位元素index.
  4. 查找时进行同样的操作, 时间复杂度也为O(1).

示例: 如HashMap, redis中的Hset的实现.

2. flag标识

场景1:boolean标识
对于单字段flag, 有多种状态a,b,c…,每种状态值为有/无, 如有a状态, 无a状态.
且状态需考虑后续拓展, 且flag可能同时包含多种状态, 如同时拥有a,b状态. 如何设计flag?
实现:

  1. 设计flag为int类型, 每种状态对应int的每一个位,每个位的1/0标识有无.
  2. 如状态a为 00000001(省略int前三个字段),状态b为00000010, 状态c为00000100.
  3. 判断某flag是否拥有a状态: 判断flag&a==a结果即可.
    如某状态为00010101, 00010101&00000001=00000001,结果为true, 即包含a状态, 反之不包含.
  4. 一般适用于较少状态值, 若状态值较多, 可考虑用其他算法实现.

示例: linux文件系统的rwx权限.

场景2:分组标识
对于单字段flag, 有多组状态a,b,c…,每组状态值有n种状态值, 如有a组状态, 有a1,a2,…,an.
且状态组(或状态值)需考虑后续拓展, flag每组状态有且只有1种状态值. 如何设计flag?
实现:

  1. 设计flag为int类型, 每组状态占3个位, 该3个位的每种形态代表一个状态值.
  2. 如a组共有23个状态a1=0,a2=1,…,a8=7为:
    00000000, 00000001, 00000010, 00000011, 00000100, 00000101, 00000110, 00000111.
    b组共有23个状态b1=0,b2=1,…,b8=7为:
    00000000, 00001000, 00010000, 00011000, 00100000, 00101000, 00110000, 00111000.
  3. 求a组状态值: flag & (23-1)
    求b组状态值: flag >>>1*3 & (23-1)
    求c组状态值: flag >>>2*3 & (23-1)
  4. 上述每组3个位, 可根据实际最大每组状态值数量设计.
  5. 适用于每组状态不多, 且组数量不多. 若状态值较多, 且扩展不可控, 可考虑用其他算法.

示例: RocketMq, Nettty的状态映射.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值