/* 问题描述: 输入一个十进制的整数,转化为二进制,输出有多少个1. 解题思路: (1):位操作,然后移动光标。不是移动输入数字,而是移动flag。 因为负数第一个为1,向右移动为了保证负数,所以填充为1, 出现无限循环的可能。 (2):第二种效率更高,二进制出现多少个1,就循环多少次。 while (n) { number++; n = (n - 1) & n; } 相关问题: (1) 一条语句判断是不是2的整数次方。 那就是判断是否只有一个1! if (n != 0 && (0 == (n - 1) & n)) printf("是2的整数次。\n") (2) 把一个整数减去1之后,再和原来的整数相与,得到新的数,相当于把原来的数字,最右面的1换成0。 printf("%d", x&(x-1)); */ #include <stdio.h> int countOneInNum1(int x) { int number = 0; int i = 0; unsigned int flag = 1; //无符号整型 while (flag) { i++; if (x & flag) number++; flag = flag << 1; //左移动flag } //循环了32次 int占4个字节, 4 * 8 = 32 printf("循环了-- %d -- 次\n", i); return number; } int countOneInNum2(int n) { int number = 0; while (n) { number++; n = (n - 1) & n; } return number; } int main() { int x; scanf("%d", &x); printf("%d\n", countOneInNum1(x)); printf("%d\n", countOneInNum2(x)); //把一个整数减去1之后,再和原来的整数相与,得到新的数, //相当于把原来的数字,最右面的1换成0。 printf("%d\n", x&(x-1)); if (x != 0 && (0 == ((x - 1) & x))) printf("%d是2的整数次。\n", x); return 0; }
原文:http://www.cnblogs.com/hgonlywj/p/4842552.html