当前位置:   article > 正文

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

深入理解计算机系统 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);
}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/757831
推荐阅读
相关标签
  

闽ICP备14008679号