C语言位操作符练习,奇偶位数的统计,统计两个数字中二进制为不相同的有多少位

一,实现要求

1. 统计奇偶位数为一的二进制打印出来?

思路:

  1. 提取所有的奇数位,如果该位是1,输出1,是0则输出0
  2. 以同样的方式提取偶数位置
    假设输入56:原码:00000000 00000000 00000000 00111000 反码:00000000 00000000 00000000 00111000 补码:00000000 00000000 00000000 00111000
    因为二进制数总共有32位,所以偶数位置总共16位。

检测num中某一位是0还是1的方式:

  1. 将num向右移动i位
  2. 将移完位之后的结果与1按位与,两个都为真即结果为真。如果:
    结果是0,则第i个比特位是0
    结果是非0,则第i个比特位是1

2.求两个整数当中,二进制不同位数的个数有多少个?

思路:

  1. 先将m和n进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1
  2. 统计异或完成后结果的二进制比特位中有多少个1即可

二.代码实现

第一题
void Printbit(int num)
{
	for (int i = 31; i >= 1; i -= 2)//从前往后开始每次,跳过两位,总共循环16次
	{
		printf("%d ", (num >> i) & 1);//使用右移操作符   逻辑右移:左边使用0填充。算术右移:左边使用符号位填充。右边逐个丢弃。
	}
	printf("\n");

	for (int i = 30; i >= 0; i -= 2)
	{
		printf("%d ", (num >> i) & 1);
	}
	printf("\n");
}
int main()
{
	int n=0;
	printf("请输入一个整数:");
	scanf("%d", &n);
	Printbit(n);

	return 0;
}

第二题
#include <stdio.h>
int calc_diff_bit(int m, int n)
{
	int tmp = m ^ n;
	int count = 0;
	while (tmp)//如果tmp的结果不为零则进入循环。
	{
		tmp = tmp & (tmp - 1);//消除tmp中的最低位
		//简单假设:tmp=3:0000 0011   tmp-1=2:0000 0010
		//tmp=2:0000 0010 tmp-1=1:0000 00001
		count++;
	}
	return count;
}


int main()
{
	int m, n;
	while (scanf("%d %d", &m, &n) == 2)
	{
		printf("%d\n", calc_diff_bit(m, n));
	}
	return 0;
}

三.学习总结

1.在遇见困难时,要学会极限放缩,将困难进行量化。
2.所有的学习,一定要进行理解,并且进行回顾。
3.不要在乎别人要中的自己。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值