题目5.消除尾一
下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0
如果最后一位是0,则原数字保持不变。
如果采用代码中的测试数据,应该输出:
00000000000000000000000001100111 00000000000000000000000001100000
00000000000000000000000000001100 00000000000000000000000000001100
请仔细阅读程序,填写划线部分缺少的代码。
#include<stdio.h>
voidf(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");
}
intmain()
{
f(103);
f(12);
return 0;
}
注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。
看到题目的第一眼,有两个思路:
采取异或去一;
采取加一去一;
显然第二种想法是最简单实现的->(x+1);
拿103来举例子:
00000000000000000000000001100111->
00000000000000000000000001101000
后面红色标记意味着全部得变为0;
怎么变?这里采取&符号即可解决。
所以所填代码为:
x=x&(x+1);