整数中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 << " Please input a Integer : " ;
 8     cin >> n;
 9     s = n;
10
11     while( n )
12     {
13         counter ++;
14         n = n & (n - 1);
15     }
16
17     cout << " Number of One in " << s << " is " << counter << endl;
18
19     return 0;
20 }

Output

 Please input a Integer : 20
 Number of One in 20 is 2

总结

  若是负数,则输出补码中包含 1 的个数。当然还有其他的方法: 初始化 1 ,让 1 依次循环左移,依次与 n 进行按位与操作,可得结果。

  

时间: 2024-11-03 17:03:28

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

求出整数中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出

统计整数中1的个数

题目:给定一个无符号整数x,求x的二进制表示中1的个数. 分析: 看到二进制,基本上就各种位运算的骚操作吧. 算法一: 最容易想到的,不断除2,并进行统计. 算法二: 如果已知大多数数据位是 0 的话,那么还有更快的算法,这个算法基于一个事实:x&(x-1)会消掉最后一个1. 算法三: 分治法,均分成两半,1的个数=左边1的个数+右边1的个数. #include<bits/stdc++.h> using namespace std; typedef unsigned int uint;

Solution 28: 整数中1的个数

问题描述 输入1个整数,求其二进制表示中有多少个“1”. 解决思路 1. 不断右移,碰到1与0与,计数:(对于负数不可,会死循环): 2. 与(n-1)与,相当于清除最右端的“1”,计数. 程序 思路2: public class NumOfOne { public int getNumOfOne(int num) { int count = 0; while (num != 0) { num = num & (num - 1); ++count; } return count; } }

【C语言】输入一个整数,输出该数二进制表示中1的个数(三种方法)

输入一个整数,输出该数二进制表示中1的个数.如输入32,输出1. 代码实现: 方法1:与运算 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; int FindOneNumber(unsigned int num) {     int numberofOne = 0;     while (num)     {         num = num & (num - 1);         

求从1到500的整数中能被3和5整除但不能被7整除的数的个数

     设为1到500的整数中能被i整除的数的集合,, 则,,, ,,, ,      满足条件的整数个数为:,根据容斥原理有:         我知道是容斥原理,关键是不知道最后一个公式,用两个集合想想韦氏图就行了.

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

输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: n &(n-1)把n的最右边的1去掉,用count++计算1的个数  eg: 101 & 100 = 100   1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 int count = 0; 5             while(n!=0){ 6                 count++; 7                 n = n&

求整数范围中1的个数

一.解法 1 public int NumberOf1Between1AndN_Solution(int n) { 2 int ones = 0; 3 for (long m = 1; m <= n; m *= 10){ 4 long a = n/m, b = n%m; 5 //对应位置>=2的时候 //对应位置为1的时候 6 ones += (a+8)/10*m +((a%10 == 1)? (b+1):0); 7 } 8 return ones; 9 } 二.思路 1.我们每次分别求个位,

10.4 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。

有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图.写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. 看了下上机指导上的答案,感觉自己写的这段代码有点low. //一个数组一个指针 #include <stdio.h> #define N 10 #define M 3 int b[N]; int * p=b; int main(){ void change(int a[N],int m); int a[N]={1,2,3,4,5,6,7,8,9,0};