位操作符的进一步运用

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

分析:整型有32个比特位,所以限制了其长度。要得到翻转的结果,首先让其数的二进制与1进行&运算,这样只有最低位有数,然后将其得到的结果左移到最高位。每一次循环都给这个数右移一位,这样就可以遍历到他的每一位。

#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
unsigned int reverse_bit(unsigned int n){
	int i = 0;
	int ret1;
		int ret = 0;
		for (i = 0; i < 32; i++){
			int vul = n & 1;
			ret1 = vul << (31 - i);
			ret |= ret1;
			n >>= 1;
		}
		return ret;
}
void main(){
	unsigned int n;
	printf("please input the number:\n");
	scanf("%u", &n);
	printf("%u\n", reverse_bit(n));
	system("pause");

}

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

分析:我们都知道,一个数右移一位就相当于除以2,所以可以采用右移的思想,但如果直接对两个数的和右移会造成溢出。所以采用以下方法

#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
void main(){
	int a=0, b=0;
	printf("please input two numbers:\n");
	scanf("%d %d", &a, &b);
	int ave = ((a&b) + (a^b)) >> 1;
	printf("%d\n", ave);
	system("pause");
}

3.编程实现:一组数据中有一个数字出现了一次。其他数字都是成对出现的。请找出这个数字

分析:
对此我用了异或操作符,两数相同为0,不同为1,从第一个数开始遍历数组,若是相同,异或的结果为0,不输出。若是不同,则输出此数,该数则为我们要找的数

#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
int main(){
	int a[9];
	int b = 0;
	int i = 0;
	int length = (sizeof(a) / sizeof(a[0]));
	printf("please input the array:\n");
	
	for (i = 0; i < length; i++){
		scanf("%d", &a[i]);
		b ^=a[i];    //引入异或,相同为0,不同为1,输出不同
	}
		printf("%d\n", b);
		system("pause");
	}

猜你喜欢

转载自blog.csdn.net/weixin_42373873/article/details/88926517
今日推荐