1、编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:在32位机器上25这个值包含以下各位
00000000 00000000 00000000 00011001
翻转后:(2550136832)
1001100000000 00000000 00000000 000
程序结果返回:
2550136832
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
unsigned int reverse_bit(unsigned int n) {
int i;
unsigned ret = 0;
for (i = 0; i < 32; i++) {
ret += ((n >> i) & 1) << (31 - i);
}
return ret;
}
int main() {
unsigned int n = 0;
printf("请输入一个数:");
scanf("%d", &n);
printf("翻转后的值为%u\n", reverse_bit(n));
system("pause");
return 0;
}
2、不使用(a+b)/2这种方式,求两个数的平均值。
#include<stdio.h>
#include<stdlib.h>
int ave(int a, int b) {
return a + ((b - a) >> 1);
}
int main() {
int a, b;
printf("请输入两个数;");
scanf("%d%d", &a, &b);
printf("这两个数的平均值为%d\n", ave(a, b));
system("pause");
return 0;
}
3、编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
#include<stdio.h>
#include<stdlib.h>
int find_num(int* arr, int len) {
for (int i = 0; i < len-1; i++) {
arr[0] = arr[0] ^ arr[i];
}
return arr[0];
}
int main() {
int arr[] = { 1,2,3,4,5,4,3,2,1 };
int len = sizeof(arr) / sizeof(arr[0]);
printf("这个数字为:%d\n", find_num(arr, len));
system("pause");
return 0;
}
4、有一个字符数组的内容为:“student a am i”,
请你将数组的内容改为"i am a student"。
要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
student a am i
i ma a tneduts
i am a student
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void swap(char* left, char* right) {
char tmp;
while (left <= right) {
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
char reverse_array(char* arr) {
int len = strlen(arr);
swap(arr, arr + len - 1);//先将整个数组逆置
while (*arr != '\0') {
char* start = arr;
char* end = start;
while (((*end) != ' ') && ((*end) != '\0')) {
end++;//end指向空格位置的地址
}
swap(start, end - 1);//单词的起始位置为start,结束位置为空格前一个字符(end-1)
if (*end != '\0') {
arr = end + 1;//当结束一个单词的逆置后,下一个单词的开始为空格后一个字符(end+1)
}
else {
arr = end;//如果*end = '\0',则arr结束循环。
}
}
}
int main() {
char arr[] = "student a am i";
reverse_array(arr);
printf("%s\n", arr);
system("pause");
return 0;
}