[剑指Offer]12.二进制中1的个数
来源:互联网 发布:java sun认证 怎么考 编辑:程序博客网 时间:2024/05/23 18:27
题目
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路
把一个整数减去1,再和原整数做与运算,会把整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多次这样的操作。
代码
/*---------------------------------------* 日期:2015-07-20* 作者:SJF0115* 题目: 12.二进制中1的个数* 结果:AC* 网址:http://www.nowcoder.com/books/coding-interviews/8ee967e43c2c4ec193b040ea7fbb10b8?rp=1* 来源:剑指Offer* 博客:-----------------------------------------*/#include <iostream>#include <vector>#include <string>#include <stack>#include <algorithm>using namespace std;class Solution {public: int NumberOf1(int n){ int count = 0; while(n){ n &= (n-1); ++count; }//while return count; }};int main(){ Solution s; int n; while(cin>>n){ int result = s.NumberOf1(n); // 输出 cout<<result<<endl; }//while return 0;}
思路二
我们可能很快就有一个思路:先判断整数二进制表示中最右边一位是不是1.接着把输入的整数右移一位,此时原来处于从右边数起第二位被移到最右边了,再判断是不是1。这样每次移动一位,直到整个整数变成0为止。基于这个思路我们写完下面的程序。但是当我们输入一个负数时,这个方法就会出现问题。比如0x80000000,把负数0x80000000右移一位时并不是简单的把最高位的1移到第二位变成0x40000000,而是0xC0000000。这是因为移位前是个负数,仍然要保证移位后是个负数,因此移位后最高位仍然是1。如果一直做右移运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环。
代码二
class Solution {public: int NumberOf1(int n){ int count = 0; while(n){ if(n & 1){ ++count; }//if n = n >> 1; }//while return count; }};
思路三
为了避免死循环,我们可以不右移输入的数字n。首先把n和1做与运算,判断n的最低位是不是为1。接着把1左移一位得到2,再和n做与运算,就能判断n的次低位是不是1…….这样反复左移,每次都能判断n的其中一位是不是1。
代码三
/*---------------------------------------* 日期:2015-07-20* 作者:SJF0115* 题目: 12.二进制中1的个数* 结果:AC* 网址:http://www.nowcoder.com/books/coding-interviews/8ee967e43c2c4ec193b040ea7fbb10b8?rp=1* 来源:剑指Offer* 博客:-----------------------------------------*/#include <iostream>#include <vector>#include <string>#include <stack>#include <algorithm>using namespace std;class Solution {public: int NumberOf1(int n){ int count = 0; int base = 1; while(base){ if(n & base){ ++count; }//if base = base << 1; }//while return count; }};int main(){ Solution s; int n; while(cin>>n){ int result = s.NumberOf1(n); // 输出 cout<<result<<endl; }//while return 0;}
0 0
- 剑指offer:二进制中1的个数
- 剑指offer:二进制中1的个数
- 【剑指offer】二进制中1的个数
- [剑指Offer]二进制中1的个数
- 【剑指offer】二进制中1的个数
- 剑指offer--二进制中1的个数
- 剑指offer:二进制中1的个数
- 剑指offer 二进制中1的个数
- 剑指offer 二进制中1的个数
- 《剑指offer》二进制中1的个数
- 剑指 offer:二进制中1的个数
- 剑指offer-二进制中1的个数
- 剑指offer 二进制中1的个数
- 剑指offer-二进制中1的个数
- 剑指offer 二进制中1的个数
- [剑指offer]二进制中1的个数
- 《剑指offer》-二进制中1的个数
- 剑指offer|二进制中1的个数
- 数列有序
- 调用淘宝ip库解析ip
- IOS基本数据类型的包装类
- 如何在虚拟机中安装linux系统
- Codeforces Round #311 (Div. 2) D
- [剑指Offer]12.二进制中1的个数
- 软件开发培训日记7_20
- OC运行和方法实现
- [DLX重复覆盖] hdu 3529 Bomberman - Just Search!
- POJ3620
- HDUOJ1094
- Android 外部存储无法写入的解决方法
- CODEVS 1081 线段树区间修改
- 状态模式