求二進制中1的個數
阿新 • • 發佈:2017-08-16
number 求一個 col clas main style logs -1 esp
如何快速的求一個數二進制表示時1的個數呢。
除了用n&(n-1)外,還可以用下面的這種方法。
1. 最開始把相鄰奇數位和偶數位相加
2. 然後相鄰4位相加,相鄰8為相加,相鄰16為的相加。得到最後1的個數。
這種做法的復雜度的是log(位數)
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; class Solution { public: int NumberOf1(int n) { unsigned sn= n; //常規做法
int ret = 0; while (sn) { ret++; sn = (sn - 1) & sn; } sn = n; unsigned tmp; tmp = (0x55555555) & sn; sn = tmp + ((sn & 0xaaaaaaaa) >> 1); //printf("%x\n", sn); tmp = (0x33333333) & sn; sn = tmp + ((sn & 0xCCCCCCCC) >> 2); //printf("%x\n", sn); tmp = (0x0F0F0F0F) & sn; sn = tmp + ((sn & 0xF0F0F0F0) >> 4); //printf("%x\n", sn); tmp = (0x00FF00FF) & sn; sn = tmp + ((sn & 0xFF00FF00) >> 8); //printf("%x\n", sn);tmp = (0x0000FFFF) & sn; sn = tmp + ((sn & 0xFFFF0000) >> 16); //printf("%x\n", sn); return sn; } }; int main() { Solution so; int n; cin >> n; cout << so.NumberOf1(n) << endl; return 0; }
求二進制中1的個數