/*
前置条件:无符号整数右移不产生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);
}