《剑指offer》 二进制中1的个数

本题来自《剑指offer》 二进制中1的个数

题目:

  输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路:

  两种思路:

  第一种:对n进行左移,检测最后一位是否为1,但考虑负数,一直左移会陷入到死循环中。

  第二种:对n的每一位进行检测,采用滑标flag,左移,int会是32位,所以会最多移动32次。

C++ code1:(第二种思路)

class Solution {
public:
     int  NumberOf1(int n) {           //最多可以移动32次,
         int count=0;
         unsigned int flag = 1;        //无符号的整形数据【0,655**】
         while(flag){                  //flag左移直到,为0时候便结束
             if (flag&n){              //和n相与,如果为1就累计
                 count += 1;
             }
             flag = flag << 1;         //flag左移[0000-31-00001]
         }
         return count;
     }
};

C++ Code2:

class Solution {
public:
     int  NumberOf1(int n) {           //最多可以移动32次,
         int count=0;
         while(n){                  //flag左移直到,为0时候便结束
             count ++;        n = (n-1)&n;
         }
         return count;
     }
};

总结:

  检测是否为1,采用与1相与的操作。考虑正数和负数和0做测试集。

原文地址:https://www.cnblogs.com/missidiot/p/10763524.html

时间: 2024-07-29 07:19:38

《剑指offer》 二进制中1的个数的相关文章

leetcode 338. Counting Bits,剑指offer二进制中1的个数

leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种方法,利用奇偶性找规律 class Solution { public: vector<int> countBits(int num) { vector<int> result{0}; for(int i = 1;i <= num;i++){ if(i % 2 == 0) res

[剑指offer] 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入描述 一个整数 输出描述 该数二进制表示中1的个数 题目分析 解法一 运行时间:29m 占用内存:629k public int NumberOf1(int n) { String s=Integer.toBinaryString(n); char[] c=s.toCharArray(); int j=0; for(int i=0;i<c.length;i++){ if(c[i]=='1'){ j++; } } re

剑指offer—二进制中1的个数

题目: 实现一个函数,输入一个整数,输出该数二进制表示中1的个数.如9的二进制是1001,因此输入9输出2. 解法一:可能死循环 int num1(int n) { int count =0; while(n) { if(n&1) count++; n=n>>1; } return count; } 上面的函数如果输入一个负数,如果一直做右一运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环. 解法二:无死循环但效率低 int num1(int n) { int count =

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

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. #include <iostream> #include <cstdio> #include <cstring> #include<vector> using namespace std; class Solution { public: int NumberOf1(int n) { int count=0; unsigned int mark=1; while(mark){ if

剑指offer——二进制中0的个数

题目链接:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路: 数字-1做与操作 1 public class Solution { 2 public int NumberOf1(int n) { 3 4 int count=0; 5 6 while(n!=0) 7 { 8 count++; 9 n = n &(n-1); 10 } 11 return count; 12 13 } 14 } 原文地址:https://www.cnblogs.com/wangyufeiai

剑指offer——二进制中1的个数(c++)

题目描述实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如,把9表示成二进制是1001,则输出为2 常规解法首先把n和1做位运算,判断n的最低位是不是1,然后把1左移一位得到2,再把n和2做位运算,判断n的次低位是不是1…这样反复左移.循环的次数等于整数二进制的位数,32位的整数需要循环32次. class Solution { int NumberOfOne(int n){ int cnt = 0; unsigned int flag = 1; while(flag){ if(n

剑指Offer08 二进制中1的个数

1 /************************************************************************* 2 > File Name: 08_NumOf1InBinary.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月29日 星期一 20时40分15秒 6 ************************************

剑指offer中二进制中1的个数

容易想到的是将n一位一位的和1进行比较,产生如下代码 但是这样的话会出下面的问题 那么就是原数据不动,将1依次移动进行比较有如下的代码 一种更简单的方法是: 这样做的思路是 总而言之

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

题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路 把一个整数减去1,再和原整数做与运算,会把整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多次这样的操作. 代码 /*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 题目: 12.二进制中1的个数 * 结果:AC * 网址:http://www.nowcoder.com/books/coding-int

【剑指offer】二进制中1的个数

题目描述: 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 分析描述: 1.对一个整数的二进制形式,要想知道其中1的个数,首先想到的应该就是遍历整个二进制数,用到的方法当然就是移动了(包含左移或右移).例如,用1来跟给定的整数做与运算.如果结果为1,则证明整数的二进制形式中,最右边的一位是1,如果结果是0,则证明整数的二进制形式中,最右边的一位是0. int NumberOf1(int n) { int co