二进制中1的个数

题目描述:

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

输入:

输入可能包含多个测试样例。

对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。

。n保证是int范围内的一个整数。

输出:

对应每个测试案例,

输出一个整数,代表输入的那个数中1的个数。

样例输入:
3
4
5
-1
样例输出:
1
2

32
/*
二进制中1的个数
by Rowandjj
2014/7/24
*/
#include<stdio.h>
#include<stdlib.h>
//解法1
int func1(int n)
{
	unsigned int flag = 1;
	int count = 0;
	while(flag)//需要循环32次
	{//从低到高依次判断该位是否为1
		if(n & flag)
		{
			count++;
		}

		flag = flag << 1;
	}
	return count;
}
//解法2----->非常巧妙的办法
int func2(int n)
{
	int count = 0;
	while(n)
	{
		count++;
		n = (n-1)&n;//通过此操作可以去掉二进制n最后的一个1
	}
	return count;
}
int main()
{
	int n,m,i;
	while(scanf("%d",&n) != EOF)
	{
		for(i = 0; i < n; i++)
		{
			scanf("%d",&m);
			printf("%d\n",func2(m));
		}
	}
	return 0;
}

二进制中1的个数,布布扣,bubuko.com

时间: 2024-12-26 21:57:31

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

leetcode 338. Counting Bits,剑指offer二进制中1的个数

leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种方法,利用奇偶性找规律 class Solution { public: vector<int> countBits(int num) { vector<int> result{0}; for(int i = 1;i <= num;i++){ if(i % 2 == 0) res

[剑指offer] 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入描述 一个整数 输出描述 该数二进制表示中1的个数 题目分析 解法一 运行时间:29m 占用内存:629k public int NumberOf1(int n) { String s=Integer.toBinaryString(n); char[] c=s.toCharArray(); int j=0; for(int i=0;i<c.length;i++){ if(c[i]=='1'){ j++; } } re

剑指offer—二进制中1的个数

题目: 实现一个函数,输入一个整数,输出该数二进制表示中1的个数.如9的二进制是1001,因此输入9输出2. 解法一:可能死循环 int num1(int n) { int count =0; while(n) { if(n&1) count++; n=n>>1; } return count; } 上面的函数如果输入一个负数,如果一直做右一运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环. 解法二:无死循环但效率低 int num1(int n) { int count =

剑指offer.二进制中1的个数(位运算)

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. #include <iostream> #include <cstdio> #include <cstring> #include<vector> using namespace std; class Solution { public: int NumberOf1(int n) { int count=0; unsigned int mark=1; while(mark){ if

剑指offer——二进制中0的个数

题目链接:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路: 数字-1做与操作 1 public class Solution { 2 public int NumberOf1(int n) { 3 4 int count=0; 5 6 while(n!=0) 7 { 8 count++; 9 n = n &(n-1); 10 } 11 return count; 12 13 } 14 } 原文地址:https://www.cnblogs.com/wangyufeiai

剑指offer——二进制中1的个数(c++)

题目描述实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如,把9表示成二进制是1001,则输出为2 常规解法首先把n和1做位运算,判断n的最低位是不是1,然后把1左移一位得到2,再把n和2做位运算,判断n的次低位是不是1…这样反复左移.循环的次数等于整数二进制的位数,32位的整数需要循环32次. class Solution { int NumberOfOne(int n){ int cnt = 0; unsigned int flag = 1; while(flag){ if(n

剑指Offer08 二进制中1的个数

1 /************************************************************************* 2 > File Name: 08_NumOf1InBinary.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月29日 星期一 20时40分15秒 6 ************************************

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

容易想到的是将n一位一位的和1进行比较,产生如下代码 但是这样的话会出下面的问题 那么就是原数据不动,将1依次移动进行比较有如下的代码 一种更简单的方法是: 这样做的思路是 总而言之

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

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

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

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