介绍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. CSS3.16

    <style>#back-top { position: fixed; bottom: 10px; right: 5px; z-index: 99;}#back-top span { wi ...

  2. 王颖奇 20171010129《面向对象程序设计(java)》第十二周学习总结

    实验十二  图形程序设计 理论: 10.1 AWT与Swing简介 10.2 框架的创建10.3 图形程序设计10.4 显示图像 (具体学习总结在最后) 实验: 实验时间 2018-11-14 1.实 ...

  3. 【Spark】Spark任务调度相关知识

    文章目录 准备知识 DAG 概述 shuffle 概述 SortShuffleManager 普通机制 bypass机制 Spark任务调度 流程 准备知识 要弄清楚Spark的任务调度流程,就必须要 ...

  4. vue-cli3.0读取外部化配置文件来修改公共路径

    之前我写过一篇通过nginx配置代理转发的博客,正常来说也是正确的,但不足之处在了甲方还用了F5负载均衡和gateway来代理转发.所以之前我认为的请求->nginx转发代理->后端服务, ...

  5. DNS注入以获取WebShell -asp_POST_DNS_SQLServer_GetWebShell

    豹子安全-注入工具-asp_POST_DNS_SQLServer_GetWebShell 注意,是 DNS 注入.这种方式的注入会隐藏很多细节, 对于用户来说是透明的. 请看如下视频(该视频会停留15 ...

  6. OpenCV开发笔记(五十五):红胖子8分钟带你深入了解Haar、LBP特征以及级联分类器识别过程(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. Cannot parse "1986-05-04": Illegal instant due to time zone offset transition (Asia/Shanghai)

    调查系统错误时,发现了一个很奇怪的现象,出生日期1986-05-04号的用户始终无法注册.发现后台使用使用jodatime的代码demo如下: public static DateTime parse ...

  8. POI 导入excel数据自动封装成model对象--代码分析

    上完代码后,对代码进行主要的分析: 1.主要使用反射api将数数据注入javabean对象 2.代码中的日志信息级别为debug级别 3.获取ExcelImport对象后需要调用init()方法初始化 ...

  9. 【雕爷学编程】MicroPython动手做(06)——零基础学MaixPy之单目摄像头

    配套 OV2640摄像头:200W像素通用24P摄像头具有200万像素(1632x1232像素),其体积小.工作电压低,提供单片UXGA摄像和影像处理器的所有功能.通过SCCB总线控制,可以输出整帧. ...

  10. vue项目中使用less

    1.安装less less-loader npm i -D less less-loader 2.在 .vue文件中使用lang="less"和@import // home.le ...