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

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44930562/article/details/90722487
今日推荐