2016年蓝桥杯A组代码填空题 1.消除尾一 知识点:位运算

76 阅读1分钟

1.消除尾一 - 蓝桥云课 (lanqiao.cn)

我们知道1&0是1 0&0是0,我们genju&的这个特性来判断一个数的二进制位上是1还是0,那么这里我们也可以对这道题用&的特性来写,我们想把末尾的1全部变为0只需要把末尾的1&0即可,如果末尾不是1,是0,那0&0也还是0。

我们因为不知道末尾有多少个1,因此我们可以用进制的思想,x&x+1就可以把末尾的0全部去掉: image.png

#include <stdio.h>

void f(int x)
{
    int i;
    for(i=0; i<32; i++) printf("%d", (x>>(31-i))&1);
    printf("....");
    
    x =  x&(x+1);
    
    for(i=0; i<32; i++) printf("%d", (x>>(31-i))&1);
    printf("\n");    
}

int main()
{
    f(128+64+2);
    f(128+64+15);
    f(128+64+1);
    
    return 0;
}