介绍AddressSet.enumerateBits方法的实现,主要是x & (-x)的意义。
 
 
1. 基本定义
 
enumerateBits的意思就是用于枚举比特,或者说罗列比特,即把mask中为1的比特罗列出来。
 
2. 验证
 
enumerateBits方法功能比较简单独立,可以直接拿出来执行进行验证。
 
 
执行结果如下:
 
3. x == 0
 
没有为1的比特,返回空。
 
4. x != 0
 
 
使用x & (-x)取出x中最低的1位,然后把这一位置0后,递归调用helper接着取下一位。
返回的结果是这些比特组成的序列。
 
5. x & (-x)
 
结果是取出x中最低的为1的位。
 
 
1) -x
 
-x是对x求相反数,求相反数的操作方法就是取反加一。
 
2) x取反
 
x的所有位取反。x & (~x) = 0。
 
3) 加一:0 + 1 = 1
 
根据上面表格,如果x原位为1的话,x & (-x)相应的位为1。
因为没有进位,所以更高的位相与的结果都为0。
 
4) 加一:1 + 1 = (进1)0
 
根据上面表格,如果x原位为0的话,x & (-x)相应的位为0。
并且产生了一个进位,这个进位的1接着与下一个高位相加。
 
5) 加一:递进
 
虽然最开始加一是从最低位开始的,但加1的动作直接忽略x中原值为0的位,逐位加到最低的为1的位而停止。
 
6. bitIndexes
 
相似功能使用软件思维的另一种实现是bitIndexes方法:
 
其返回的是位序。
 
执行结果如下:
 
7. 附录
 
def enumerateBits(mask: BigInt): Seq[BigInt] = {
def helper(x: BigInt): Seq[BigInt] = {
if (x == 0) {
Nil
} else {
val bit = x & (-x)
bit +: helper(x & ~bit)
}
}
helper(mask)
}
 

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

  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. D. Mysterious Present DAG dp

    https://codeforces.com/problemset/problem/4/D 这个题目比较简单,就是一个DAG模型,这个可以看看紫书学习一下, 我这次是用dp来写的,用记忆化搜索也许更好 ...

  2. springboot设置过滤器、监听器、拦截器

    其实这篇文章算不上是springboot的东西,我们在spring普通项目中也是可以直接使用的 设置过滤器: 以前在普通项目中我们要在web.xml中进行filter的配置,但是只从servlet 3 ...

  3. Dynamics 9.0 安装好后 公告出现 提示:出现错误。 请稍等片刻,然后重试。 如果问题仍然存在,请与管理员联系。

    此问题为系统的Bug,示例图如下: 解决方案为修改存储过程 p_RetrievePosts,将startDate参数的默认值改成 1900-01-01,endDate参数的默认值改成 9999-12- ...

  4. NDK clang编译器的一个bug

    NDK clang编译器的一个bug 问题代码 float32_t Sum_float(float32_t *data, const int count) { float32x4_t res = vd ...

  5. JDBC02 加载JDBC驱动 建立连接

    JDBC(Java Database Connection)为Java开发者使用数据库提供了统一的编程接口 sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此su ...

  6. layui编辑商品时,怎么使用下拉菜单显示商品默认分类的问题

    //加载商品默认的分类$.get('/admin/category/selec/' + {$simple.0.first_pid},function(msg){ $("#two_cate&q ...

  7. Hadoop CDH版本安装和启动(CentOS7)

    1.创建hadoop组和用户,useradd hadoop passwd hadoop groupadd hadoops usermod -G hadoops hadoop(将hadoop添加到had ...

  8. RabbitMQ及延时队列

    一.简介 我用过RabbirMQ的发布订阅模式,以及一对一的延迟队列. 1.RabbitMQ的有消息确认机制,消费一条则队列中少一条,也有对应的消费到消息及认为是消费成功这样的模式,一般使用前者. 发 ...

  9. Docker的安装(Linux)

    官网下载安装说明 1.卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ doc ...

  10. Django之钩子Hook方法

    局部钩子: 在Fom类中定义 clean_字段名() 方法,就能够实现对特定字段进行校验.(校验函数正常必须返回当前字段值)  def clean_name(self): pass         n ...