程序员面试题精选(45):求给定整数其二进制形式含1的个数
2007-12-06 21:44
381 查看
题目描述:求给定整数其二进制形式含1的个数,比如255含8个1,因其二进制表示为11111111;
下面给出了两种求解代码实现。
#include <iostream>
using namespace std;
int CountOne( int n)
{
int count = 0 ;
while (n)
{
++ count;
n &= n - 1 ;
}
return count;
}
int CountOnesUsingTable(unsigned int i)
{
static int BIT_TABLES[ 256 ] =
{
0 , 1 , 1 , 2 , 1 , 2 , 2 , 3 , 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4
, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5
, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7
, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7
, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7
, 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 , 5 , 6 , 6 , 7 , 6 , 7 , 7 , 8
} ;
return BIT_TABLES[i & 255 ] + BIT_TABLES[i >> 8 & 255 ] +
BIT_TABLES[i >> 16 & 255 ] + BIT_TABLES[i >> 24 & 255 ];
}
int main()
{
cout<<"158 has : "<<CountOne(158)<<endl;
cout<<"158 has : "<<CountOnesUsingTable(158)<<endl;
getchar();
}
下面给出了两种求解代码实现。
#include <iostream>
using namespace std;
int CountOne( int n)
{
int count = 0 ;
while (n)
{
++ count;
n &= n - 1 ;
}
return count;
}
int CountOnesUsingTable(unsigned int i)
{
static int BIT_TABLES[ 256 ] =
{
0 , 1 , 1 , 2 , 1 , 2 , 2 , 3 , 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4
, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5
, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7
, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7
, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6
, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7
, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7
, 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 , 5 , 6 , 6 , 7 , 6 , 7 , 7 , 8
} ;
return BIT_TABLES[i & 255 ] + BIT_TABLES[i >> 8 & 255 ] +
BIT_TABLES[i >> 16 & 255 ] + BIT_TABLES[i >> 24 & 255 ];
}
int main()
{
cout<<"158 has : "<<CountOne(158)<<endl;
cout<<"158 has : "<<CountOnesUsingTable(158)<<endl;
getchar();
}
相关文章推荐
- 给定一个正整数n,找到小于或等于n的非负整数,其二进制表示不包含连续的整数。
- 程序员面试题精选100题(06)-判断整数序列是不是二元查找树的后序遍历结果
- 程序员面试题精选(17):把字符串转换成整数
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字
- 程序员面试题精选100题(22)-整数的二进制表示中1的个数
- 程序员面试题精选100题(17)-把字符串转换成整数
- 程序员面试题精选100题(44)-数值的整数次方
- 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]
- 程序员面试题100题第22题——整数2进制表示中1的个数
- 程序员面试题精选100题(17)-把字符串转换成整数[算法]
- 程序员面试题精选100题(17)-把字符串转换成整数
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字
- 程序员面试题精选100题(06)-判断整数序列是不是二元查找树的后序遍历结果
- 程序员面试题精选100题(17)-把字符串转换成整数[算法]
- 程序员面试题精选100题(22)-整数二进制表示中1的个数[算法]
- 程序员面试题精选100题(10)-在排序数组中查找和为给定值的两个数字
- 程序员面试题精选--06 判断整数序列是不是二元查找树的后序遍历结果
- 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]
- 程序员面试题精选100题(44)-数值的整数次方