统计一个整数二进制中1的个数

输入一个非负整数num,对于每一个i,0<=i<=num,计算i的二进制表示中,有几个‘1’,例如输入num=5,输出0,1,1,2,1,2。

#include <iostream>

using namespace std;
// 解法1
int countOne(int num)
{
    int count = 0;
    while ( num )
    {
        // 当最后一位为1时,则加1
        if( num & 1 ){
            ++count;
        }
        num >>= 1;
    }
    return count;
}
/* 解法2,比如当二进制中的1只有一个时,num & (num - 1)会等于0,以此判断即可。
 * 比如:    0000 0100
 *        & 0000 0011
 *        = 0000 0000
 */
int countOne2(int num)
{
    int count = 0;
    while ( num )
    {
        num &= (num - 1) ;
        ++count;
    }

    return count;
}

int main(int argc, char *argv[])
{
    int i,num;
    cout << "请输入num:" << endl;
    cin>>num;
    cout<<"解法一:"<<endl;
    for(i=0;i<=num;i++)
    {
        cout<<countOne(i)<<",";
    }
    cout<<endl;
    cout<<"解法二:"<<endl;
    for(i=0;i<=num;i++)
    {
        cout<<countOne2(i)<<",";
    }
    return 0;
}

时间: 2024-10-09 20:42:10

统计一个整数二进制中1的个数的相关文章

一个整数二进制中1的个数

方法一: 思路:如果一个数与1作与运算则可以发现该数最后一位数为1,否则为0. 按照此思路可以有以下代码: 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 7 int n = 0; 8 cout << "输入一个数"; 9 cin >> n; 10 int count = 0; 11 while (n) 12 { 13 14 if (n & 1) 15 { 1

华为OJ:查找输入整数二进制中1的个数

不得不说这道题就是一道十分蛋疼的题,我本来想着对输入的整数K对1按位与运算,然后再将K向右移一位,循环这样做,知道K为0. 万万没想到,程序一直超时,莫名其妙,看讨论上说是因为这编译器高位补零,还能不能再坑一点. import java.util.Scanner; public class binarySystemOneNumber { public static int findNumberOf1(int k){ int count=0; int num=1; for(int i=1;i<=I

求一个整数的二进制中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 假设该整数为i.首先i和1做与运算,判断i的最低位是不是为1.接着把1左移一位得到2,再和i做与运算,就能判断i的次高位是不是1……这样反复左移,每次都能判断i的其中一位是不是1.基于此,我们得到如下代码 int NumberOf1_Solution(int i) { int count = 0; unsigned int flag = 1; while(flag) { if(

ACM:每行输入一个正整数n,找出与它对应的比它大的最小的且它们对应的二进制中1的个数一样多的正整数.

#include<stdio.h> //每行输入一个正整数i,找出与他对应的比它大的最小的正整数且他们的二进制中1的个数一样多. /* 样例输入: 样例输出: 1 2 2 4 3 5 4 8 78 83 0 */ //78的二进制位1001110,有4个1:83比78大且83的二进制位1001011也是4个1. int main() { int count1,count2;//count1统计原数据对应的二进制中1的个数,count2... int a[100];//存输入的数字 int i=

【C语言】统计一个数二进制中1的个数

//统计一个数二进制中1的个数 #include <stdio.h> int count_one(int num) { int count = 0; while (num) { count++; num = num&(num - 1); //每次消去最后面的一个1,直至没有 } return count; } int main() { printf("%d\n", count_one(12)); printf("%d\n", count_one(

Java之一个整数的二进制中1的个数

这是今年某公司的面试题: 一般思路是:把整数n转换成二进制字符数组,然后一个一个数: private static int helper1(int i) { char[] chs = Integer.toBinaryString(i).toCharArray(); int res = 0; for (int j = 0; j < chs.length; j++) { if (chs[j] == '1') { res++; } } return res; } 第二种方法是:将整数n与1进行与运算,

说一说,求一个正整数的二进制中0的个数

昨天突然看到一个算法题:一个正整数a的二进制中0的个数: 话说这是个老题了,直观的算法就每次右移一位,直到0为止:代码就省略了: 仔细想想有更好的方案么? 就是这个题可以转换成一个正整数~a的二进制中1的个数: 求1的个数这个貌似就很熟悉了吧: int num = 0; b = ~a; while(b){ num++; b = b & (b-1); } 是不是容易了许多呢 另外像java和python这种没有unsigned的语言要自己去转 b = ~a & 0x0ffff

[ACM] POJ 3252 Round Numbers (一个区间内二进制中0的个数大于等于1的个数有多少个,组合)

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8590   Accepted: 3003 Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors',

第2章 数字之魅——求二进制中1的个数

求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二进制操作,我们知道,除以一个2,原来的数字将会减少一个0.如果除的过程中有余,那么就表示当前位置有一个1. 以10 100 010为例: 第一次除以2时,商为1 010 001,余为0. 第二次除以2时,商为101 000,余为1. 因此,可以考虑利用整型数据除法的特点,通过相除和判断余数的值来进行分析.于是有了如下的