Bootstrap

深入理解计算机系统 CSAPP 家庭作业 2.66

/*

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

;