输入1个数输出其二进制表示中1的个数

来源:互联网 发布:淘宝客鹊桥pid 编辑:程序博客网 时间:2024/05/29 16:34

面试题。题目描述就是写一个函数,要求输入一个数,输出其二进制表示中1的个数。此处假设输入的为int型。

 

方法一:首先想到的就是位运算,用移位得出每一位是否为1。代码如下所示。

#include <iostream>using namespace std;int numberof1(int in){int count = 0;int input = in;for(int i = 0; i < 32; i++){if(1 == (input & 1))count++;input >>= 1;}return count;}int main(){int numbertocount;cin>>numbertocount;cout<<numberof1(numbertocount)<<endl;return 0;}


方法二:其次想到的是直接像数组一样取每一位的值,如此只要把所有的位相加起来,得出的值即为所求,其它代码不变,numberof1函数代码如下所示。

int numberof1(int in){int count = 0;char input[32];itoa(in, input, 2);for(int i = 0; i < strlen(input); i++){count += input[i] - '0';}return count;}


方法三:不直接取每一位的值,采用除以2取余数,余数相加即为所求,其它代码不变,numberof1函数代码如下所示。

int numberof1(int in){int count = 0;int input = in;for(int i = 0; i < 32; i++){count += input % 2;input /= 2;}return count;}


方法四:采用位运算变相得出1的个数,其它代码不变,numberof1函数代码如下所示。

int numberof1(int in){int count = 0;int input = in;while(input){count++;input &= input - 1;}return count;}


方法五:不使用循环,采用空间换取时间的策略,如32位机中int为32位,定义2的32次方大小的int型数组,其中每个元素存对应序号的二进制表示中1的个数。如此求输入值的二进制表示中1的个数就可以转化成查表的方式来进行,查表的优化可以采用索引。