面试题10:二进制中1的个数
第一种解法是用1不断左移做与运算
第二种解法是:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变为0
把一个整数减去1后再和原来的数做与运算,得到的结果相当于把整数的二进制表示中最右边一个1变为0。很多二进制的问题都可以用这个思路解决。判断一个数是不是2的整数次方:减去1,再和原整数做与运算
1 // NumberOf1InBinary.cpp : Defines the entry point for the console application. 2 // 3 4 // 《剑指Offer——名企面试官精讲典型编程题》代码 5 // 著作权所有者:何海涛 6 7 #include "stdafx.h" 8 9 int NumberOf1_Solution1(int n) 10 { 11 int count = 0; 12 unsigned int flag = 1; 13 while(flag) 14 { 15 if(n & flag) 16 count ++; 17 18 flag = flag << 1; 19 } 20 21 return count; 22 } 23 24 int NumberOf1_Solution2(int n) 25 { 26 int count = 0; 27 28 while (n) 29 { 30 ++ count; 31 n = (n - 1) & n; 32 } 33 34 return count; 35 } 36 37 void Test(int number, unsigned int expected) 38 { 39 int actual = NumberOf1_Solution1(number); 40 if(actual == expected) 41 printf("Solution1: Test for %p passed. ", number); 42 else 43 printf("Solution1: Test for %p failed. ", number); 44 45 actual = NumberOf1_Solution2(number); 46 if(actual == expected) 47 printf("Solution2: Test for %p passed. ", number); 48 else 49 printf("Solution2: Test for %p failed. ", number); 50 51 printf(" "); 52 } 53 54 int _tmain(int argc, _TCHAR* argv[]) 55 { 56 // 输入0,期待的输出是0 57 Test(0, 0); 58 59 // 输入1,期待的输出是1 60 Test(1, 1); 61 62 // 输入10,期待的输出是2 63 Test(10, 2); 64 65 // 输入0x7FFFFFFF,期待的输出是31 66 Test(0x7FFFFFFF, 31); 67 68 // 输入0xFFFFFFFF(负数),期待的输出是32 69 Test(0xFFFFFFFF, 32); 70 71 // 输入0x80000000(负数),期待的输出是1 72 Test(0x80000000, 1); 73 74 return 0; 75 }