判断32位无符号整数二进制中1的个数
1、比较简单和容易理解的方法就是逐位比较法: #include <iostream> using namespace std; int findone(unsigned int n){ for(int i=0;n>0;n>>=1) i+=(n&1); return i; } int main(){ int n; cin>>n; cout<<findone(n)<<endl; return 0; } 这种方法的缺点是比较费时,时间长度取决于n的位数,时间复杂度O(n)。假如上千上万位的话,每一位都要执行一遍,所用时间就很长了。 2、最直接的优化方法,其实就是空间换时间的思想:可以预建立一个表,存放了从0~2^32每个数中1的个数,用时去查一下表就知道了。但这样显然要耗费很多的空间(至少2^32/(256/32)=512MB,哈哈,正是一般内存大小)。于是需要再优化:存放0-255每个数中1的个数,然后分段查询。如下面把32位数分为4段,每段一个字节,所以有一个256大小供查询的表: char tOne[256]="\0\1\1\2\1\2……"; //后面省略 int findone(unsigned int n){ for(int i=0;n>0;n>>=8) //每次右移8位将32位分成四段 i+=tOne[n&255]; return i; } 3、上次在阿里云笔试