下面的代码把一个整数的二进制表示的最右边的连续的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 = _______________________;
*/
//待填语句
x = x & (x+1);
for(i = 0; i < 32; i++)
{
printf("%d", (x>>(31-i))&1);
}
printf("\n");
}
int main()
{
f(103);
f(12);
return 0;
}
一、
该题有两个思路:
1、异或去一;
2、加一去一;
显然第二种最简单实现的;
比如103
00000000000000000000000001100111->
00000000000000000000000001101000
后面111意味着全部得变为0;
怎么办?采取&符号即可解决。
所以所填代码为:
x=x&(x+1);
二、
输出一个数x的二进制(32位):
for (int i = 0; i < 32; ++i)
{
cout << x >> (32-i) & 1;
}
cout << endl;