介绍enumerateMask的实现。(仅供理解,非严谨证明)
 
 
1. 基本定义
 
enumerateMask的意思是枚举掩码。其功能是把mask中为1的位的所有组合枚举出来。
 
enumerateMask方法的功能比较简单独立,可以直接执行进行验证:
 
执行结果如下:
 
2. helper(id, tail)
 
helper方法有两个参数:
a. id:指当前枚举的mask;
b. tail:包含已经枚举的mask;
 
第一个被枚举的mask为0,即不包含任何比特位。
所以helper的初始调用为:helper(0, Nil)
 
3. id == mask
 
若id == mask,则id中已经包含了mask中所有的为1的比特,所以可以结束枚举过程了。
可以看出,枚举的过程是从0到mask,逐渐增加id中1的位数,id成递增变化,搜集所有组合。
 
4. id != mask
 
若id != mask,则把id加入到tail中,计算下一个id,并继续进行枚举。
 
 
5. mask中为0的位
 
 
next_id = ((~mask | id) + 1) & mask
 
因为最后都是要和mask相与,所以mask中为0的位,在next_id中也同样为0。
 
所以:
a. mask中为0的位,在id中对应的位始终为0。
b. id中为1的位,在mask中对应的位一定为1。
 
另外:
c. mask中为0的位,直接向高位透传被加的1。
 
6. mask为全1
 
 
即next_id = id + 1。
 
7. mask中的0:相当于不存在
 
next_id = ((~mask | id) + 1) & mask
 
a. ~mask:mask取反会将其中为1的位也取反,但最后&mask之后会被清除,不在最终结果中出现;
b. |id:id中为1的位在mask中也都为1,所以“|id”的逻辑运算不涉及mask中为0的位;
c. +1:mask中为0的位,向高一位透传加1的动作,自己本身的值在加1之后虽然有变化,但不在最终结果中体现;加1的动作必定在mask中某一个为1的位结束;
 
所以,可以忽略mask中0的存在,直接把mask中为1的位提取出来进行运算(如同第6节所述),然后再把0填到结果的相应位中即可。
 
 
8. 附录
 
def enumerateMask(mask: BigInt): Seq[BigInt] = {
def helper(id: BigInt, tail: Seq[BigInt]): Seq[BigInt] =
if (id == mask) (id +: tail).reverse else helper(((~mask | id) + 1) & mask, id +: tail)
helper(0, Nil)
}
 
 

Rocket - diplomacy - enumerateMask的更多相关文章

  1. Rocket - diplomacy - LazyModule的组织方式

    https://mp.weixin.qq.com/s/vaDUekxkFkOJLmzg5jCngw 简单介绍LazyModule/LazyModuleImp的组织方式. 1. LazyModule L ...

  2. Rocket - diplomacy - AddressSet

    https://mp.weixin.qq.com/s/ZsEVt1GslL7ufJdJlgpfNQ   介绍AddressSet的实现.   ​​   1. 基本定义   ​​ 使用base/mask ...

  3. Rocket - diplomacy - LazyModule的实例化(补)

    https://mp.weixin.qq.com/s/rgCRorjPYyyD6i7moIzbZg   介绍LazyModule和Node构造方法的执行过程,即实例化过程.     1. NullIn ...

  4. Rocket - diplomacy - LazyModule的实例化

    https://mp.weixin.qq.com/s/9PsBt4_4qHx4i6C5XtuiUw   介绍LazyModule和Node构造方法的执行过程,即实例化过程.     1. NullIn ...

  5. Rocket - diplomacy - LazyModule

    https://mp.weixin.qq.com/s/FBU8fE4u9-UK6mRGQOlvbQ   介绍LazyModule的实现.     ​​   1. children   LazyModu ...

  6. Rocket - diplomacy - ValName

    https://mp.weixin.qq.com/s/so-2x5KLfYF0IMCCqNThwQ   简单调试ValName实现:   1. 使用     ​​   Desugar之后如下: ​​ ...

  7. Rocket - diplomacy - NodeHandle相关类

    https://mp.weixin.qq.com/s/GWL41P1G1BXm2sTeLmckdA   介绍NodeHandle相关的类.     ​​   1. NoHandle   顶层类(tra ...

  8. Rocket - diplomacy - DUEB参数模型的设计

    https://mp.weixin.qq.com/s/9PEEpe1pkQDN9RWpOGSUCQ   介绍DUEB参数模型的设计,不包含实现(实现对设计做了简化).     1. DUEB   di ...

  9. Rocket - diplomacy - 模块结构信息

    https://mp.weixin.qq.com/s/cTRxXwWNEeb4-XX_t4bRcg   讨论模块结构信息的来源及使用方式.     ​​   1. diplomacy   diplom ...

随机推荐

  1. 5.7.17版本mysqlbinlog实时拉取的二进制日志不完整的原因分析

    问题描述: 同事使用mysqlbinlog工具的--read-from-remote-server --raw选项,从远程实例实时拉取二进制日志时,发现得到的二进制日志文件大小与远程实例上的源文件大小 ...

  2. 值得收藏的js原型详解

    从虚无到Object 起初,地是空虚混沌,渊面黑暗:这时候一切还是null 神说,要有原型,于是就有了prototype 原型从凭空产生,于是需要一个指向于null的特征,人们把这种特征叫做隐式原型, ...

  3. 推荐一款 python 管理工具:anaconda

    1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 9.jpg 10.jpg 11.jpg 12.jpg 13.jpg 14.jpg 15.jpg 16.j ...

  4. 排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法

    快速排序有三大要素 分别是 第一:找基准值--key 第二:分区 第三:比较数字大小 先来看下快速排序流程: 基准值key选取了第一个元素78 基准值是可以任意一个元素 因为选择了最左边的数据,那么就 ...

  5. Redis 6.0 多线程重磅发布!!!

    Redis 6.0在5.2号这个美好的日子里悄无声息的发布了,这次发布在IT圈犹如一颗惊雷一般,因为这是redis最大的一次改版,首次加入了多线程. 作者Antirez在RC1版本发布时在他的博客写下 ...

  6. node的stream

    stream在Unix系统中是个标准的概念. In computer programming, standard streams are preconnected input and output c ...

  7. P3254 圆桌问题 网络流

    P3254 圆桌问题 #include <bits/stdc++.h> using namespace std; , inf = 0x3f3f3f; struct Edge { int f ...

  8. 【python----发轫之始】【基础知识总结】

    python基础知识总结 一.自学感受 学完之后,,,感觉脑子里全是乱的,单词这么多,都要分不清什么时候该用什么,他到底属于哪一个数据类型里的函数,,,,,, 所以,我想着把笔记整理一下,方便自己和需 ...

  9. redis集群复制和故障转移

    #### 一.集群的问题- 1.当某个主节点宕机后,对应的槽位没有节点承担,整个集群处于失败状态,不可用,怎么办- 2.如何判断某个主节点是否真正的岩机?- 3.如果从某个主节点的所有从节点中选举出一 ...

  10. sql 判断 表 视图 存储过程 存在 然后 删除

    sql 判断 函数 存储过程是否存在的方法 (2010-12-03 10:08:57) 转载▼     下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函 ...