zoukankan      html  css  js  c++  java
  • x&(-x)取x的最后一个1的证明

    转自: https://xtestw.com/2015/04/22/proof/#more

    x&(-x)取x的最后一个1的证明##

    明天要给新队员讲树状数组,避不开的一个证明,之前教主讲过,当时没听明白给忘了- -,只有自己想了一种证明方法。

    证明#####

    大家都知道,计算机是用补码来存储一个数的,在这种编码情况下,整数是自然状态编码,假设我们是一个5位的机器(只是假设),那么1,编码就为00001, 而-1的编码则是11111(并不是10001),在这种情况下,我们会有下面的结论:

                 -x=11111 – x +1 (x 假设为正数二进制)  -----------------结论一
                  x=00000 + x (x 假设为正数二进制) ----------------------结论二
    

    我们还会有以下2个结论:

    结论三:11111 - x 不会出现借位的情况(二进制下 ,对应位只会是两种情况 1-0 和 1-1)
    结论四:00000 + x 不会出现进位的情况(二进制下,对应位只会是 0+1,0+0)
    

    假设 x的二进制编码为 x1 x2 x3 x4 x5

    那么我们就会发现 对于任何一位(以x1为例) 0+x1 和 1-x1 两个 必然是一个为1 一个为0,因为:

    X1的值 0+x1 1-x1
    0 0 1
    1 1 0

    有了上面的结论,我们把焦点放到x的最后几位,我们要分离的是最后一个1,那么假设是第i位xi是最后一个1,那么i位以后的每一位都是0,在这个基础上,根据上面这个表格,我们会发现,11111-x 这个值在第i位以后全部都是1,而第i位为0,整理一下,每一位如下:

    1. X的每一位为  x1 ,x2,…… xi-1, 1 ,0,0,0…. 后面每一位都是0
    2. 11111-x 结果的每一位为 1-X1,1-X2,….1-Xi-1 ,0,1,1,1….. 后面每一位都是1
    

    下面这一点是关键 ,就是 –x = 11111-x +1, 也就是说-x的每一位是这样的:

    					1-X1,1-X2,….1-Xi-1 ,1,0,0,0…..
    

    也就是说,最后一位+1 ,然后会变成0 一直往前进位到第i位,将第i位变成1后停止进位, 我们现在比较一下 x 和 –x的每一位的值, 会发现 ,除了第i位为一样的1,其余每一位都是不一样的即,都是一组0,1. 那么

    					X&(-X)= 0,0,0….1, 0,0,0,….
    

    除了第i位是1,其他每一位的值都是0, 而根据我们最开始所说的,X的第i位的1就是X当前二进制编码的最后一个1,所以通过 x &(-x) 我们能够得到x的最后一个

  • 相关阅读:
    关于初入.NET的那些事
    有趣的接口和抽象类
    类型转换的那些趣事(is和as)
    【项目实践】SpringBoot三招组合拳,手把手教你打出优雅的后端接口
    【项目实践】一文带你搞定Session和JWT的登录认证方式
    【项目实践】后端接口统一规范的同时,如何优雅得扩展规范
    羊车门问题简析
    对于python这门课程的一些想法、计划、期望
    Android 4.1果冻豆新特性详解
    使用include实现布局(layout)复用
  • 原文地址:https://www.cnblogs.com/xtestw/p/4449195.html
Copyright © 2011-2022 走看看