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(
"\n"); } 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,没变的地方还是原来的样子,所以就满足了题意。

 

posted @ 2019-11-30 20:57  帅气的涛啊  阅读(226)  评论(0编辑  收藏  举报