• Rocket


     
    介绍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)
    }
     
    
  • 相关阅读:
    http从发出请求到接收响应的旅行
    git(二)github的使用入门及搜索技巧
    git(一) 基础
    获取基于Internet Explorer_Server的聊天窗口内容
    主机字节与网络字节的转换
    SQL Server存储过程中防止线程重入处理方式
    利用NVelocity 模版生成文本文件
    C# async await 学习笔记2
    C# async await 学习笔记1
    imx6 工具链下载地址
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10669790.html
Copyright © 2020-2023  润新知