一个整数二进制中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       {
16           count++;
17       }
18       n >>= 1;
19   }
20       cout << "1的个数为"<<count<<endl;
21       return 0;
22   }

但是此方法存在缺陷如果输入的数为负数则会无限死循环

方法二:

首先把n与1做与运算,判断n的最低位是不是为1。接着把1左移一位得到2,再和n做与运算,就能判断n的次低位是不是1….这样反复左移,每次能判断n的其中一位是不是1.这个解法中循环的次数等于整数二进制的位数,32位的整数需要循环32次

 1 #include <iostream>
 2   using namespace std;
 3
 4   int main()
 5   {
 6
 7       int n = 0;
 8       int key = 1;
 9       cout << "输入一个数";
10       cin >> n;
11       int count = 0;
12       while (key)
13  {
14
15       if (n & key)
16       {
17           count++;
18       }
19       key <<= 1;
20   }
21       cout << "1的个数为"<<count<<endl;
22       return 0;
23   }

方法三

思路:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0,那么一个整数的二进制表示中有
多少个1,就可以进行多少次这样的操作。

 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           n = ((n - 1)& n);
14           count++;
15
16   }
17       cout << "1的个数为"<<count<<endl;
18 }

本文结束。

【转载】https://blog.csdn.net/weibo_dm/article/details/80531465

原文地址:https://www.cnblogs.com/yelao/p/12536398.html

时间: 2024-10-10 04:45:12

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

统计一个整数二进制中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 ){      

华为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=

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',

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

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

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

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