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的最后一个

  • 相关阅读:
    173. Binary Search Tree Iterator
    199. Binary Tree Right Side View
    230. Kth Smallest Element in a BST
    236. Lowest Common Ancestor of a Binary Tree
    337. House Robber III
    449. Serialize and Deserialize BST
    508. Most Frequent Subtree Sum
    513. Find Bottom Left Tree Value
    129. Sum Root to Leaf Numbers
    652. Find Duplicate Subtrees
  • 原文地址:https://www.cnblogs.com/xtestw/p/4449195.html
Copyright © 2011-2022 走看看