关于位运算的一些习题:1.这个函数的返回值是value的二进制位模式从左到右翻转后的值2.不使用(a+b)/2这种方式3.一组数据中只有一个数字出现了一次。其他所有数字都是成对出,找出这个数字

博客介绍了三道编程题及解法。一是编写函数将无符号整数的二进制位模式翻转,有两种位运算方法;二是不使用 (a+b)/2 求两数平均值,通过位与、位异或运算实现;三是找出一组数据中唯一出现一次的数字,利用异或运算特性求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1>编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值是value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
————————————————————————————————————
有两种方法,程序中有分别进行解释:
第一种:先右移除每一位,再对右移出的每一位乘以其翻转后相对应位数的权值
第二种:先右移出每一位,在对每一位左移到其对应的翻转后的位置

#include<stdio.h>
#include<Windows.h>
#include<math.h>
unsigned int reverse_bit(unsigned int value)
{
	double sum = 0;
	int i = 0;
	for (; i < 32; i++)
	{
		//sum += ((value >> i) & 1)*pow((double)2, 31 - i);先右移除每一位,再对右移出的每一位乘以其翻转后相对应位数的权值
		sum += ((value >> i) & 1) << (31 - i);//先右移出每一位,在对每一位左移到其对应的翻转后的位置
	}
	return sum;
}
int main()
{
	printf("%u",reverse_bit(25));
	system("pause");
	return 0;
}

2>.不使用(a+b)/2这种方式,求两个数的平均值。
————————————————————————————————————
对题目的解释:
m&n得出两个数中相同的部分,m^n的出两个数中不同的部分,对不同的部分平分(除以2或者右移一位)对这两部分相加,得到两个数的平均值

#include<stdio.h>
#include<Windows.h>
int Get_Arverage(int m, int n)
{
	return (m&n) + (m^n) / 2;
}
int main()
{
	printf("%d", Get_Arverage(2, 5));
	system("pause");
	return 0;
}

3>.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
————————————————————————————————————
对题目的解释:

对数组中的所有元素一起进行异或运算最后得出的值就是要找的数字,相同的两个元素进行异或后会得到0值,0与任何数异或都得到它本身,异或支持交换律。

#include<stdio.h>
#include<Windows.h>
int Get_number(int *arr, int len)
{
	int i = 0;
	int result = 0;
	for (; i < len; i++)
	{
		result ^= arr[i];
	}
	return result;
}
int main()
{
	int arr[] = { 1, 3, 5, 1, 3 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int result = 0;
	result = Get_number(arr, len);
	printf("%d",result );
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值