被黑的网站内容管理系统开源

/*
前置条件:无符号整数右移不产生1
调用函数是为了可以查看整个过程,不影响结果.
 思路是让x在右移的过程中,把最高位之前的位全部填满.
 填满后的结果右移一位(即x的最高位变为0,其他为1),再异或x得到最高位
  
以此类推知道覆盖到32位.
 */
#include <stdio.h>
 #include <stdlib.h>
unsigned leftmost_one(unsigned x);
int main(void)
 {
     char s[32];
     unsigned x =0x10100000;
     itoa(x,s,2);
     itoa(leftmost_one(x),s,2);
     printf("1x=0x\t\t%32s\n",s);
 }
unsigned leftmost_one(unsigned x)
 {
     char a[32];
     itoa(x,a,2);
     printf("a|=x>>0=0x\t%32s\n",a);
     x|=x>>1;//第一次往后复制1次最高位(填满了2位),
    itoa(x,a,2);
     printf("a|=x>>1=0x\t%32s\n",a);
     x|=x>>2;//第二次往后复制第一次的结果(填满了2*2位)
    itoa(x,a,2);
     printf("a|=x>>2=0x\t%32s\n",a);
     x|=x>>4;//第三次往后复制第二次的结果(填满了2*2*2位)
     itoa(x,a,2);
     printf("a|=x>>4=0x\t%32s\n",a);
     x|=x>>8;
     itoa(x,a,2);
     printf("a|=x>>8=0x\t%32s\n",a);
     x|=x>>16;
     itoa(x,a,2);
     printf("a|=x>>16=0x\t%32s\n",a);
     return x^(x>>1);
 }
