统计整数中1的个数

题目:给定一个无符号整数x,求x的二进制表示中1的个数。

分析:

看到二进制,基本上就各种位运算的骚操作吧。

算法一:

最容易想到的,不断除2,并进行统计。

算法二:

如果已知大多数数据位是 0 的话,那么还有更快的算法,这个算法基于一个事实:x&(x-1)会消掉最后一个1。

算法三:

分治法,均分成两半,1的个数=左边1的个数+右边1的个数。

#include<bits/stdc++.h>
using namespace std;

typedef unsigned int uint;

// 时间复杂度: x的二进制位数
int count1(uint x)
{
    int ret = 0;
    while(x)
    {
        ret += (x&1);
        x >>= 1;
    }
    return ret;
}

/*
    时间复杂度:x的二进制中1的个数
    每进行一次 x&(x-1) 就会消掉最后一个1,
    所以 与 的次数就是1的个数
*/
int count2(uint x)
{
    int cnt = 0;
    while(x)
    {
        x = x & (x-1);
        cnt++;
    }
    return cnt;
}

/*
    分治法:
        左边1个数 + 右边1的个数
        出口:只有一个元素时
    递归;当然也可以改成循环
*/
int count3(uint x, int len, uint mask)
{
    if(len == 1)  return x;
    len >>= 1;
    mask >>= len;
    uint r = x & mask;
    uint l = x >> len;
    return count3(l, len, mask) + count3(r, len, mask);
}

int main()
{
    int n;
    int t = 5;
    while(t--)
    {
        scanf("%d", &n);
        printf("%d %d %d\n", count1(n), count2(n), count3(n, 32, 0xffffffff));
    }
    return 0;
}

参考链接:https://www.cnblogs.com/csulennon/p/4224859.html

原文地址:https://www.cnblogs.com/lfri/p/12404965.html

时间: 2024-11-06 19:49:10

统计整数中1的个数的相关文章

统计数组中重复元素个数

/** * 循环统计数组或集合中的重复元素个数 * @param args */ public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); String[] ss = {"白","黑","绿","白"}; for (int i = 0; i < ss.len

整数中1 的个数

问题 求整数中1的个数 原理 一个数n若不为0,从数的最低为到最高位,第一个为1 的位记为 i ,则减去 1 之后,改为变为0,i 右边的所有位都变为1,因此 n & (n-1)可得 n中剩余比 i 更高位序 的 部分 ,循环此操作,则可得 1 的计数. 代码 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int n,s,counter = 0; 7 cout << " Plea

输入的数转化为二进制序列,并统计序列中1的个数

★输入的数转化为二进制序列,并统计序列中1的个数 描述:普通的模除取余后数直接除二的办法易于理解,但是对于输入的数只限于正数和零,对于负数则不适应,所以采用与后移位的方法以此来扩大数的输入范围. #include<stdio.h> int main() { int m,b,c,i; int count = 0; char a[32]; printf("请输入一个数:\n"); scanf("%d", &m); for (i = 0; i <

学c语言做练习之?统计文件中字符的个数

统计文件中字符的个数(采用命令行参数) #include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]) {  char ch;  FILE *fp;  long count=0;    if(argc !=2)  {   printf("文件名是:%s\n",argv[0]);   exit(EXIT_FAILURE);  }  if ((fp=fopen(argv[1],"r

统计字符串中汉字的个数

字符串可以包括数字.字母.汉字或者其他字符.使用Charater类的isDigit()方法可以判断字符串中的某个字符是否为数字, 使用Character类的isLetter()方法可以判断字符串中的某个字符是否为字母. 本案例将介绍用"正则表达式"来判断字符串中的某个字符是否为汉字,并统计该字符串中汉字的数量. 关键技术: Java中提供Pattern用于正则表达式的编译方式,该类的静态方法matches()可以执行正则表达式的匹配.该方法的声明如下: public static bo

问题 C: c#统计字符串中数字字符的个数

题目描述 假设有一个GetNumber方法(参数为字符串strSource),编写一个静态方法可以用来统计字符串strSource中数字字符的个数. 输入 输入一个字符串strSource 输出 strSource字符串中数字字符的个数 样例输入 .wrapper {position: relative;} #input {position: absolute;top: 0;left: 0;opacity: 0;z-index: -10;} copy asffkl8asjkfjklas3jdf9

高效统计整数中 1 的比特数

输入一个无符号整数,统计该整数中含1的比特数. #include<stdio.h> int numbits(unsigned int n) { int count = 0; while(n>0){ n &= (n-1);//每次操作去掉n中最低位的1 count++; } return count; } int main() { unsigned int n; scanf("%d",&n); printf("%d\n",numbit

求出整数中1的个数

输入一个整数,求出它的二进制1的个数.考虑的知识点:负数怎么求,因为计算机中存放都是补码的形式存储一个数.因为正数的源码,反码,补码都是一样,不用考虑.但是负数就要考虑了,比如-0,它的源码应该是10000000 00000000 00000000 000000000 00000000,所以负数要考虑. 下面是代码实现: #ifndef _FINDNUMBEROF1_ #define _FINDNUMBEROF1_ /*================================ Macro

nyoj 222 整数中的1个数以及这类问题

之前也写过一篇这样的文章,但是隔了这么久,竟然忘了.还是要有清晰的思路,才能真正的掌握. 这道题是这样的: 给出两个非负32位整型范围内的数a,b,请输出闭区间[a,b]内所有数二进制中各个位的1的总个数. 分析:为的是求2进制中1的个数.从0-15的二进制如下: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 第一位的1,每隔2就出现.第二位的1,每隔4出现2次.第三位的1,每隔8出