1. 程式人生 > >求二進制中1的個數

求二進制中1的個數

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的個數