`
SunnyYoona
  • 浏览: 384933 次
社区版块
存档分类
最新评论

[剑指Offer]12.二进制中1的个数

 
阅读更多

题目

输入一个整数,输出该数二进制表示中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;
}
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    aspire-t#LeetCode-Record#剑指 Offer 15. 二进制中1的个数1

    剑指 Offer 15. 二进制中1的个数方法一:位运算* @param {number} n - a positive integervar hammingW

    c++-剑指offer题解之二进制中1的个数

    c++ c++_剑指offer题解之二进制中1的个数

    python-剑指offer第11题二进制1的个数

    python python_剑指offer第11题二进制1的个数

    剑指offer面试题15. 二进制中1的个数(位运算)

    剑指Offer面试题15就提出了这样一个问题:如何计算一个整数在二进制表示中1的个数?这个问题看似简单,但其背后的位运算技巧却蕴含了丰富的编程智慧。 首先,我们来看一下给出的解决方案。这个问题的解答关键在于位...

    《剑指Offer》题目及代码.zip

    《剑指Offer》 1. 赋值运算函数 2. 单例设计模式 3. 二维数组中查找目标值 4. 替换字符串中的空格 5. 从尾到头打印链表 6. 由前序和中序遍历重建二叉树 7. 用两个栈实现队列 8. 求旋转数组的最小数字 9. ...

    gdutxiaoxu#AndroidGuide#【Java】剑指offer(14)二进制中1的个数1

    1.正数(包括边界值1、0x7FFFFFFF) 2.负数(包括边界值0x80000000、0xFFFFFFFF) 1.与二进制有关的题目要往位运算方面想,复习一

    Python《剑指offer》算法实现-二进制中1的个数

    # Python实现《剑指offer》 部分代码自己添加了一些测试用例, 或者自己添加了一些功能 1. 初级程序员注重算法和数据结构 2. 事先做好准备,对工作有热情 3. 面试过程放松。不要急于写代码,了解清楚所要解决的问题,...

    leetcode中国-LeetCode-Go:力码围棋

    leetcode中国 LeetCode ...二进制中1的个数 Y Y Y 剑指 Offer 17. 打印从1到最大的n位数 Y Y Y 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Y Y Y 剑指 Offer 24. 反转链表 Y Y Y 剑指 Offer 25. 合并

    剑指offer学习心得

    - **问题描述**:输入一个整数,输出该数二进制表示中1的个数。 - **解决方案**: - 循环移位法:不断右移并计数。 - 位运算技巧:利用“n & (n - 1)”将最低位的1变为0。 以上仅为《剑指Offer》中部分章节的知识...

    剑指offer题解(C++).docx

    《剑指Offer题解》是针对面试准备的一份宝贵资源,由Sidney.Tan精心整理,结合了牛客网上的讨论、《剑指Offer》书中的解法以及个人的编程实践,提供了全面的代码和思路解析。这份文档按照牛客网上的题目顺序,覆盖了...

    java版剑指Offer

    《剑指Offer》是一本非常流行的求职面试书籍,尤其在准备中国IT行业相关职位的候选人中。这本书籍主要采用Java语言编写,覆盖了众多面试中常见的算法题目和数据结构问题,是帮助求职者提高编程能力和应对面试技巧的...

    《剑指Offer》题目及Java版代码(带目录)

    9. 二进制中1的个数:可以通过位运算来实现,这是一种高效的方法。 10. 数值的整数次方:需要考虑大数运算以及如何优化算法性能。 11. 打印1到最大的n位数:需要处理大数的存储和输出问题,以及避免整数溢出。 12...

    《剑指Offer》题目及代码(修订版2).pdf

    - 二进制中1的个数:考察位运算技巧和高效算法。 - 二叉树中和为某值的路径:考察二叉树的遍历和递归思想。 - 数组中出现次数超过一半的数字:考察数组操作和统计算法。 - 二叉搜索树转换为双向链表:考察二叉树的...

    《剑指Offer》题目及代码.pdf

    10. 二进制中1的个数:这是一道位运算相关的题目,需要利用位与运算来计算一个整数的二进制表示中有多少个1。 11. 数值的整数次方:在不使用库函数的情况下,需要考虑幂次的分解,以及正负数、零的情况。 12. 打印...

    《剑指Offer》Java代码(高清带目录) (1).pdf

    10. 二进制中1的个数:主要考察位运算的技巧,以及如何在不使用循环的情况下计算一个整数二进制表示中1的个数。 11. 数值的整数次方:涉及到数学运算和数值计算的知识,需要考虑大数运算以及溢出问题。 12. 求1到...

    剑指offer笔记

    同时,对于二进制数中1的个数的计算,笔记指出使用位运算技巧能够有效减少计算步骤。 2. 代码规范与完整性 笔记强调了代码规范性的重要性,包括代码的书写、布局、命名以及代码的完整性。规范性关乎代码的可读性和...

    剑指offer中68道例题程序+思路讲解+题目说明.zip

    - **求整数的二进制表示中1的个数**:位运算统计二进制中1的个数,如BitCount、HammingWeight等方法。 这些知识点涵盖了数据结构、算法设计、问题解决策略等多个方面,通过深入学习和实践,不仅能提升编程能力,也...

    leetcode和剑指-Algorithm:剑指算法,leetcode,acm....等等,请访问并提供您的建议

    11.二进制中1的个数 12.数值的整数次方 13.调整数组顺序使奇数位于偶数前面 14.单链表:链表中倒数第k个结点 15.单链表:反转链表 16.单链表:合并两个排序的链表 17.二叉树:树的子结构 18.二叉树:二叉树的镜像 19....

Global site tag (gtag.js) - Google Analytics