面试题10:二进制中1的个数

面试题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.\n", number);
42     else
43         printf("Solution1: Test for %p failed.\n", number);
44 
45     actual = NumberOf1_Solution2(number);
46     if(actual == expected)
47         printf("Solution2: Test for %p passed.\n", number);
48     else
49         printf("Solution2: Test for %p failed.\n", number);
50 
51     printf("\n");
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 }

 

posted on 2016-07-04 10:28  已停更  阅读(523)  评论(0)    收藏  举报