• 2016年蓝桥杯省赛C++A组 消除尾一


    消除尾一:

    下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0
    如果最后一位是0,则原数字保持不变。

    如果采用代码中的测试数据,应该输出:

    00000000000000000000000001100111 00000000000000000000000001100000
    00000000000000000000000000001100 00000000000000000000000000001100

    请仔细阅读程序,填写划线部分缺少的代码

     

    代码:

    #include <stdio.h>
    
    void f(int x)
    {
    int i;
    for(i=0; i<32; i++) printf("%d", (x>>(31-i))&1);
    printf(" ");
    
    x =________________;
    
    for(i=0; i<32; i++) printf("%d", (x>>(31-i))&1);
    printf("
    ");    
    }
    
    int main()
    {
    f(103);
    f(12);
    return 0;
    }

    注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

    正确答案: x&(x+1)

    详解:

    1.  x>>(31-i))&1  :表示x移位后二进制数与1的二进制代码与操作,比如x=10(0000 0000 0000 1010),x>>1=(0000 0000 0000 0101),然后与1(0000 0000 0000 0001)进行“与”操作,得出0000 0000 0000 0000,这便表示x的倒数第二位的数字。(看不懂的,先百度移位操作)

    2. x&(x+1)  :题中要求把二进制最后的连续的1变为0,对于0则不做变化。比如x=247(0000 0000 1111 0111),x+1=248(0000 0000 1111 1000),所以你末尾不管有多少连续的1,加1必须全部变为0,与原来进行“与”操作以后,只要变换的地方全部都是 0,没变的地方还是原来的样子,所以就满足了题意。

  • 相关阅读:
    How to become a hacker
    逻辑地址、线性地址、物理地址和虚拟地址
    java configuration
    Java 理论与实践: 变还是不变?
    Teach Yourself Programming in Ten Years
    border padding margin , the difference among them
    hashCode方法,equals方法,HashSet,HasMap之间的关系
    工程名 显示红色叹号
    记The_C_Programming_Language的错误
    VIM简单介绍学习1
  • 原文地址:https://www.cnblogs.com/handsometaoa/p/11963921.html
Copyright © 2020-2023  润新知