zoukankan      html  css  js  c++  java
  • 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,没变的地方还是原来的样子,所以就满足了题意。

  • 相关阅读:
    QT5每日一学(五)QT布局管理器
    构造注入链:POP
    Jarvis OJ--PHPINFO
    XCTF(Web_php_unserialize)
    XCTF-反序列化中_wakeup()函数
    session反序列化
    PHP反序列化
    默认安装的phpMyAdmin会存在哪些安全隐患
    如何进行数据库备份
    开启mysql外部访问(root外连)
  • 原文地址:https://www.cnblogs.com/handsometaoa/p/11963921.html
Copyright © 2011-2022 走看看