函数的返回二进制位模式从左到右翻转后的值 && 不使用(a+b)/2这种方式,求两个数的平均值 && 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的

编写函数: 
unsigned int reverse_bit(unsigned int value); 
这个函数的返回值是value的二进制位模式从左到右翻转后的值。 
 

 这是一个相对笨蛋,但是好理解的方法。创建一个数组,使用循环将value%2放入数组每一位中,然后倒着遍历数组,每次将数组成员乘相对于的2的次方,得到最后的值。

#include<stdio.h>
#include<Windows.h>
#include<math.h>


unsigned int reverse_bit(unsigned int value){
	unsigned int sum = 0;
	unsigned int a = 0;
	unsigned int revers[32];
	for (int i = 0; i < 32; i++){
		revers[i] = value % 2;
		value >>= 1;
	}
	for (int j = 31; j >= 0; j--){
		a = revers[31 - j] * pow(2.0, j);
		sum += a;
	}
	return sum;
}

int main(){
	unsigned int val = 25;
    printf("%d \n" ,reverse_bit(val));
	system("pause");
	return 0;
}

 

不使用(a+b)/2这种方式,求两个数的平均值 

 这里运用按位异或,按位与操作,先按位异或,再右移操作,最后加上按位与的值,补上进位的值。

#include<stdio.h>
#include<Windows.h>

int Average(int x, int y){
	int sum = 0;
	sum = (x ^ y) >> 1;
	sum += x & y;
	return sum;


}

 

编程实现: 
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。  

 这里使用的思想非常简单,但是实现非常麻烦,是非常傻瓜,没有任何技巧的代码。

另创建两个数组,一个数组用来原数组中不重复的数,另一个数组用来存放遍历过程中,出现过的成对数,这样既找出了成对的数又找出了不成对的数。创建成对出现数的数组ret[]的主要目的是,当遍历循环嵌套遍历,跳过两个成对数的前一个的时候,在遍历到第二个数时,往后不会有重复的数出现,会把第二次出现的成对数放入目的数组中去,所以为了避免这种情况,建立了成对数据的数组,在最后赋值的时候做检验。代码的判断和循环语句较多,临时变量也很多,能实现功能,但不见得最优。

#include<stdio.h>
#include<Windows.h>

void FindDiff(){ 
	int arr[] = { 1, 2, 3, 1, 3, 5, 4, 7, 7 };
	int length = sizeof(arr) / sizeof(arr[0]);
	int b[10];  //目的数组
	int k = 0;  //目的数组的元素个数
	int ret[10];  //成对数组
	int r = 0;   //成对数组的元素个数
	for (int i = 0; i < length; i++)
	for (int j = i + 1; j < length; j++){
		if ((arr[i] ^ arr[j]) == 0){
			ret[r] = arr[i];
			r++;
			break;
		}
		if (j == length - 1){
			int flag = 0;   //标记值 为0时才给目标数组赋值
			for (int s = 0; s < r; s++){
				if (ret[s] == arr[i])
					flag++;  
			}
			if (flag == 0){
				b[k] = arr[i];
				k++;
			}

		}
	}
	for (int p = 0; p < k; p++)
		printf("%d ", b[p]);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值