C入门【七】[经典题型]

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

如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832

个人理解:通过移位操作符,先循环移位操作32次将 int 类型变成二进制然后每一位拿出对应存入相应的新的数组

对应的位置。

unsigned int reverse_bit(unsigned int value){
	int arr[32] = { 0 };
	printf("反转前 (24)0 0000 1010\n");
	for (int i = 0; i < 32; i++){
		if (((value >> i) & 1) == 1){
			arr[i] = 0;
		}
		else{
			arr[i] = 1;
		}
	}
	printf("反转后 (24)1 1111 0101\n");
	int ret = 0;
	int j = 0;
	for (j = 0; j < 32; j++){
		ret += arr[j] * pow(2, 32 - j);
	}
	return ret;
}

经过检验这个方法不符合题意无效

<方法一>将将数字循环32次 循环通过位操作符循环拿出右侧第一位存入对应的 32-i 处,后SUM+=求出求出结果

unsigned int reverse_bit_1(unsigned int value){
	int i = 0;
    int sum = 0;
	for (i = 0; i < 32; i++){
		sum += ((value >> i) & 1) << (32 - i);
	}
	return sum;
}

<方法二>与方案一大体相同,利用 与和 运算 求出结果

unsigned int reverse_bit_1(unsigned int value){
	int i = 0;
    int sum = 0;
	for (i = 0; i < 32; i++){
		sum += ((value >> i) & 1) << (32 - i);
	}
	return sum;
}

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

本题简单题型 在C语言中 左移位1 相当于乘2 右移1位 相当于除2

int Average(int a,int b){
	int aver = 0;
	aver = (a + b) >> 1;
	return aver;
}

int Average_1(int a, int b){
	return b + ((a - b) >> 1);
}

int Average_2(int a,int b){
	return (a&b) + ((a^b) >> 1);
}


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

int Find(int arr[]){
	int i;
	for (i = 1; i < 5; i++){
		arr[0] = arr[0] ^ arr[i];
	}
	return arr[0];
}

4.
有一个字符数组的内容为:"student a am i",
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。

student a am i
i ma a tneduts
i am a student

void reverse(char *start, char *end){  //倒置整个大字符串
	assert(start);
	assert(end);
	while (start < end){
		char temp = *start;
		*start = *end;  
		*end = temp;
		start++;
		end--;
	}
}
void reverse_string(char *str, int sz){
	assert(str);
	char *str1 = str;
	char *left = str;
	char *right = str + sz - 1;
	reverse(left, right);

	while (*str1){
		left = str1; //数组的首地址 传给left
		while ((*str1 != '\0') && (*str1 != ' ')){   //判定 找到最后一个单词时停止条件
			str1++;
		}
		right = str1 - 1;        //str1 指向单词后方的空格,需要减一方指向单词最后一个字母
		reverse(left, right);   //继整体反转之后 反转每个单词
		if (*str1 == ' '){			//让指针后移一位
			str1++;
		}

	}

猜你喜欢

转载自blog.csdn.net/qq_36390039/article/details/86552008