统计二进制中1的个数

本文提供了三种方法,分别计算一个数的二进制表示中1的个数。方法和解释分别见Count1, Count2, Count3函数。

只有Count1不能满足负数要求(会死循环进去),其他两个都可以操作32b以内正负数。

Count1:每次将x末位与1相与,看最后以为是否为1, 然后将x右移

Count2:将变量y从1开始与x相与,然后每次将y左移,和上个方法类似

Count3:每次将x&=(x-1)可以将最右边一个1变为0;

该方法应用:e.g. 如何用一个语句判断一个整数是不是2的整数次幂?

/********************/
//@Discription: Count the number of ‘1‘ in binary number
//@Author: Rachel Zhang
//@Create Date:2012-5-22
/********************/

#include"stdio.h"

int Count1(int x)
{
    int c=0;
    while(x)
    {
        c+=x&1;
        x>>=1;
    }
    return c;
}
//Bug:当x=0x80000000(negative)时,x>>1要保证还是负数,因此不是0x40000000,而是=0xc0000000
//i.e. input -2147483648(0x80000000),x>>1=-107374124(0xc0000000),而非2^30(0x40000000)
//这样最后会出现0xff导致死循环

int Count2(int x)
{
    int c=0;
    unsigned int y=1;
    while(y)
    {
        c+=x&y?1:0;
        y<<=1;
    }
    return c;
}
//Problem:不知道x的位数,会造成一些冗余运算,不过没关系,32位pc最多运算32次嘛
//不是问题的问题

int Count3(int x)
{
    int c=0;
    while(x)
    {
        x&=x-1;
        c++;
    }
    return c;
}

int main()
{
    int x;
    while(scanf("%d",&x)!=EOF)
    {
        printf("%d\n%d\n%d\n",Count1(x),Count2(x),Count3(x));
    }
    return 0;
}

源题目出处:http://zhedahht.blog.163.com/blog/static/25411174200731844235261/

时间: 2024-10-31 17:47:45

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

统计二进制中1的个数(四种方案)

方案一:(只适合计算正数) #include<stdio.h> #include<stdlib.h> int main() { int num = 10;  //10的二进制数为1010 int count = 0; while (num) { if (num % 2 == 1)    //从最高位开始除,余数为1则为1,余数为2则为0 { count++;     //余数为1时计数加1 } num = num / 2;      //除以2相当于右移一位,即丢掉计数过的 } p

统计二进制中1的个数(LeetCode 461. 汉明距离 or LeetCode 191. 位1的个数)

题目一 LeetCode 461.明距离(Hamming Distance) 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目.给出两个整数 x 和 y,计算它们之间的汉明距离. 注意 0 ≤ x , y < 231. 原文地址:https://www.cnblogs.com/hglibin/p/8984777.html

【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(

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

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

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=

剑指Offer:二进制中1的个数

题目:输入一个整数,输出该数二进制表示中1的个数. // 二进制中1的个数 #include <stdio.h> int wrong_count_1_bits(int n) // 错误解法: 当n为负数时, n>>=1右移, 最高位补1, 陷入死循环 { int count = 0; while(n) { if( n & 1 ) ++count; n >>= 1; } return count; } int count_1_bits(int n) // 常规解法

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

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

二进制中1的个数

题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. 对于每个输入文件,第一行输入一个整数T,代表测试样例的数量.对于每个测试样例输入为一个整数. .n保证是int范围内的一个整数. 输出: 对应每个测试案例, 输出一个整数,代表输入的那个数中1的个数. 样例输入: 3 4 5 -1 样例输出: 1 2 32 /* 二进制中1的个数 by Rowandjj 2014/7/24 */ #include<stdio.h> #include

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

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