关闭

C语言实现谷歌面试题:写一个函数返回参数二进制中 1 的个数

标签: 面试题谷歌c语言c语言解决谷歌面试题
259人阅读 评论(0) 收藏 举报
分类:

<span style="font-size:18px;">写一个函数返回参数二进制中 1 的个数
比如: 15       0000 1111       4 个 1

</span>
<span style="font-size:18px;">方法一:参数为整形参数,首先需要将整形参数转换为二进制序列,需要对这个参数进行模2除2。参数为正整数很容<span style="font-family: Arial, Helvetica, sans-serif;">易就得出了正确结果,但是对于负整数来说直接模2除2得出的序列为0;在参数前加上unsigned关键字就可以解决参数</span></span>
<span style="font-size:18px;">为负数的问题。</span>
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int  count_one_bits(unsigned int value)
{
	// 返回 1的位数
	int count = 0;
	int i = 0;

	while (value != 0)
	{
		if (value % 2 == 1)
		{
			count++;
		}
		value = value / 2;

	}
	return count;
}


int main()
{
	int num;
	num = count_one_bits(-1);

	printf("%d", num);
	system("pause");
	return 0;
}

方法二:对一个数按位对1取&(与);若二进制数末尾为0,对1取&后得到为0;若二进制数末尾为1,对1取&后得到为1;一个末尾数判断结束,二进制序列向右移一位再重复执行上述步骤即可;

移位操作:num = num >> 1;

比如 10的二进制序列1010,对1(0001)按位&之后为:0000,得到了二进制序列的末尾数。将1010向右移一位,在按位对1取&为:001。向右移位,按位取&直到32个二进制位全部移位。

int main()
{
	int num = -1;
	int i = 0;
	int count = 0;
	
	for (i = 0; i < 32;i++)
	{
		if ((num & 1) == 1)
		{
			count++;
		}
		num = num >> 1;
	}

	printf("%d转换为二进制中1的个数为:%d",num, count);
	system("pause");
	return 0;
}

方法三:num=num&(num-1); 代入一个数会发现每执行一次,从低位开始消除一个1,直到num为0;

int main()
{
	int num = 3;
	int count = 0;
	int c = num;
	
	while (num!=0)
	{
		num = num&(num - 1);
		count++;
	}

	printf(" %d 转换为二进制中1的个数为:%d个",c,count);
	system("pause");
	return 0;
}




0
0
查看评论

写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 4 个 1 程序原型: int count_one_bits(unsigned int value) { //

#include int count_one_bit(int n) { int count=0; while(n) { n=n&(n-1); count++; } return count; } int main() { int n=-1; int count=count...
  • qq_41148509
  • qq_41148509
  • 2017-12-09 22:30
  • 22

写一个函数返回参数二进制中1的个数

写一个函数返回参数二进制中1的个数分析:(1)输入一个数(2)判断它是否为0。(3)如果不为0,就对它进行模2取余,模2的过程就相当于把这个数向右移除了一位,如果余数为1,则证明移除的这一位为1,就将其记录下来。如果余数为0,就证明移除的这一位为0,就不记录。(4)经过第3步以后,对这个数进行除2取...
  • Stand__out
  • Stand__out
  • 2016-06-02 10:44
  • 670

C语言中写一个函数返回参数二进制中 1 的个数

通过C语言程序将十进制数转化成二进制数,然后求出二进制数中1的个数。下面用三种方法来实现。来方法一:除2取余法。对一十进制数,用2辗转相除至结果为1,将余数和最后的1从下向上倒序写就是对应的二进制。例如:十进制数302转化成二进制。302/2=151余0;151/2=75余1;75/2=37余1;3...
  • Scenlyf
  • Scenlyf
  • 2016-06-11 18:49
  • 1760

【C语言】求一个数的二进制中 1 的个数

求一个数的二进制的1的个数
  • LX18792732127
  • LX18792732127
  • 2016-09-19 11:33
  • 1632

C语言编程之计算二进制数中1的个数

首先我们利用第一种方法,在这我们可以知道,我们从二进制最小位依次往上看。 例如:5的二进制是101,如果它的二进制最小位上是有数值得,这样我们就对他++,否则,我们就进行移位操作,这部操作当然也可以用除二来代替。 代码如下://写一个函数返回参数的二进制中1的个数 #include<std...
  • qq_26768741
  • qq_26768741
  • 2016-03-15 22:30
  • 3236

c语言:统计整数二进制表示中1的个数(汉明重量)

问题描述:对于一个字节的无符号整型变量,求其二进制表示中1的个数。 第一次见到这个问题应该是icephone第一次例会的时候,问题虽然简单,但也值得深思。 后来查阅资料的时候才知道这个问题有个正式的名字叫Hamming_weight,也被一些公司当做面试题。 下面通过几个不同阶段的算法,谈谈这个...
  • hitwhylz
  • hitwhylz
  • 2013-08-20 21:29
  • 6013

C语言求二进制中1的个数

#include int main() { int num=-1; int count=0;     while(num) {  num=num&(num-1);  count++; } printf("count = ...
  • chen739481102
  • chen739481102
  • 2016-10-30 13:54
  • 282

【C语言】统计一个数二进制中1的个数

//统计一个数二进制中1的个数 #include int count_one(int num) { int count = 0; while (num) { count++; num = num&(num - 1); //每次消去最后面的一个1,直至没有 } retu...
  • doudouwa1234
  • doudouwa1234
  • 2015-07-01 09:45
  • 1310

(c语言)求一个二进制数1的个数

问题描述: 输入一个整型数a,计算这个数中在二进制存储方式下1的个数。 程序分析: 1.输入的整型数a在计算机中是以二进制的形式存储,我们采用的方法是逐位判断。 2.当这个数a大于0时,将该数和1相与(按位与),如果相与的结果为1,说明当前为1,将事先定义好的用来计数的count加1,在将该数右移一...
  • live_wyq
  • live_wyq
  • 2015-04-20 22:37
  • 1062

如何写出一个返回多个值的c语言子函数

今天跟以往一样刷水题,因为水题没有刷完。我发现刷水题还是有用的,自己没有理解清楚的c的知识,等你写的代码报错后,你就能都弄懂了。结果今天这题目引发我了我的一个问题,题目如下: 5个数求最值 时间限制:1000 ms  |  内存限制:65535 KB 难度...
  • u014574317
  • u014574317
  • 2016-07-22 10:23
  • 3378
    个人资料
    • 访问:7125次
    • 积分:409
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类