本文共 763 字,大约阅读时间需要 2 分钟。
下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0
如果最后一位是0,则原数字保持不变。如果采用代码中的测试数据,应该输出:
00000000000000000000000001100111 00000000000000000000000001100000 00000000000000000000000000001100 00000000000000000000000000001100请仔细阅读程序,填写划线部分缺少的代码。
#includevoid 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;
转载地址:http://ivtai.baihongyu.com/