C语言 Example(五)

1. 写一个函数返回参数二进制中 1 的个数,比如:13的二进制为0000 1011其中有3个1,该函数原型为: int count_one_bits(unsigned int value) // 返回 1的位数 。

(1)一开始写的时候,想到的方法是遍历value的每一位,让它的每一位与1,设置一个计数变量count,如果与1之后得到的结果还是1,那么就count++。那么如何让value的每一位与1呢?我们知道整形的二进制有32位,所以value中有32位要与1,于是我们设置一个for循环 for (i = 0;i < 32;i++),并且每循环一次就让value右移一位,直到32位均与1。

(2)但是考虑到这样的方式比较麻烦,所以改进了一下,用value&(value-1)的方式获取value二进制中1的个数,原理如下图所示,每循环一次count++,当value==0之后则跳出循环。

#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

//int count_one_bits(unsigned int value)
//{
//	int i = 0;
//	int count = 0;
//	for (i = 0;i < 32;i++)
//	{
//		if ((value & 1) == 1)
//		{
//			count++;
//		}
//		value = value >> 1;
//	}
//	return count;
//}

int count_one_bits(unsigned int value)
{
	int count = 0;
	while (value != 0)
	{
		count++;
		value = value & (value - 1);
	}
	return count;
}

int main()
{
	int ret = 0;
	unsigned int value = 0;
	scanf("%d", &value);
	ret=count_one_bits(value);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。

(1)首先想到的方法是,先获取某个数n的二进制数,然后存放在数组之中,然后用下标对数组进行访问并打印出所存放的数。

(2)后来改进了一下,分别进行对奇数位和偶数位的遍历,每隔两位打印一次,与1之后为1则打印1,否则打印0.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

//int main()
//{
//	int i = 0;
//	int n = 0;
//	int a[32] = { 0 };
//	printf("请输入一个数:> ");
//	scanf("%d", &n);
//
//	//将十进制转化为二进制,存放在数组里
//	for (i = 31; i>0; i--)
//	{
//		a[i] = n % 2;
//		n /= 2;
//	}
//	
//	//打印数组中存放的二进制
//	printf("二进制为:> ");
//	for (i = 0; i < 32; i++)
//	{
//		printf("%d", a[i]);
//	}
//	printf("\n");
//
//	//打印奇数位数字
//	printf("奇数位为:> ");
//	for (i = 1; i <= 31; i += 2)
//		printf("%d", a[i]);
//	printf("\n");
//
//	//打印偶数位数字
//	printf("偶数位为:> ");
//	for (i = 0; i <= 30; i += 2)
//		printf("%d", a[i]);
//	printf("\n");
//
//	system("pause");
//	return 0;
//}

int main()
{
	int n = 10;
	int i = 0;
	for (i = 31;i >= 1;i -= 2)
	{
		printf("%d ", (n >> i) & 1);
	}
	printf("\n");
	for (i = 30;i >= 0;i -= 2)
	{
		printf("%d ", (n >> i) & 1);
	}
	printf("\n");
	system("pause");
	return 0;
}

3.编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 
输入例子: 1999 2299  输出例子:7

我们知道有一个运算符叫做异或即:^,两数异或后相同位为0,不同则为1,当我们想知道两个数中有多少个bit位不同,可以通过求两数异或之后的值,然后判断该值中有多少个1,就可以化作本篇第一题了。 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

int Print(int a, int b)
{
	a = a ^ b;
	return a;
}


int count_one_bits(int a)
{
	int count = 0;
	while (a)
	{
		count++;
		a = a & (a - 1);
	}
	return count;
}

int main()
{
	int a = 0;
	int b = 0;
	int ret1 = 0;
	int ret2 = 0;
	scanf("%d%d", &a, &b);
	ret1 = Print(a, b);
	ret2 = count_one_bits(ret1);
	printf("%d\n", ret2);
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值