剑指offer-10 二进制中1的个数
2015-05-06 15:18
435 查看
#include <iostream> using namespace std; //位运算 /* 一个数与1 进行& ,实际是这个数的二进制的最后一位与1& */ /* 方法一:将这个数与1求&,然后右移一位 可能会引起死循环 */ unsigned int NumberOfOne_1(int n) { unsigned int result = 0; while(n) { if(n&1) result++; n = n>>1; } return result; } /* 方法二:首先,n&(flag=1) 计算 n的最低位是不是1 然后 flag<<1==2,计算n的次低位是不是1 继续 flag == 4,这样循环往复,每次都能判断N的其中一位是不是1, 有多少个1,就会循环多少次 */ unsigned int NumberOfOne_2(int n) { unsigned int result = 0; unsigned int flag = 1; while(flag) { if(n&flag) result++; cout<<"flag = "<<flag<<endl; flag = flag<<1; } return result; } /* 如果一个数不等于0,那么他的二进制中至少有一位1 考虑,对这个数减一的情况 1、如果这个数的最右一位是1,那么最后一位变为0,而其他位不变 2、如果这个数的最右一位不是1,假设这个数最右边的1位于第M位,那么减一时, 第m位变成0,m位之后的全部变成1,第m位之前的保持不变 3、现在考虑将一个数与这个数减一求与操作 将这个数最右边的1变成0。 即:将一个数与这个数减一求与,会把这个数最右边一个1变成0.一个数中的二进制有多少1, 就会进行多少次这样的操作。 */ unsigned int NumberOfOne_3(int n) { unsigned int result = 0; while(n) { result++; n = n&(n-1); } return result; } int main() { cout << NumberOfOne_2(15) << endl; //cout << NumberOfOne_1(15) << endl; cout << NumberOfOne_3(15) << endl; return 0; }
相关文章推荐
- 剑指offer---二进制中1的个数(10)
- 剑指offer-面试题10-二进制中1的个数
- 剑指Offer面试题10(Java版):二进制中的1的个数
- 【剑指offer】面试题10:二进制中1的个数
- 剑指Offer之二进制中1的个数(题10)
- 剑指Offer_面试题10_二进制中1的个数
- 剑指offer 面试题10 二进制中1的个数
- 剑指offer 10 二进制中1的个数
- 【剑指offer】题10:二进制中1的个数
- 剑指Offer 10 二进制中1得个数
- 剑指offer-面试题10:二进制中1的个数
- 剑指Offer-10-二进制中1的个数
- 【剑指offer】面试题10: 二进制中1的个数
- 剑指offer面试题10:计算二进制中1的个数
- [剑指offer][面试题10]二进制中1的个数
- 剑指Offer:面试题10 二进制中1的个数
- 【剑指Offer学习】【面试题10 :二进制中1 的个数】
- 剑指offer面试题[10]-二进制中1的个数
- 剑指offer 面试题10:二进制中1的个数 题解
- 剑指offer-面试10:二进制中1的个数(位运算)