1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值是value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832#include<stdio.h> #include<math.h> #include<Windows.h> unsigned int reverse_bit(unsigned int value) { int sum = 0; int i = 0; int b = 0; for (i = 0; i < 32; i++) { b= ((value >> i) & 1)*pow(2,31 - i);//取出最低位,左移到相应位置 sum += b; } return sum; } int main() { int num = 25; int res=reverse_bit(num); printf("反转后:%u\n", res); system("pause"); return 0; }
2.不使用(a+b)/2这种方式,求两个数的平均值。一个数和另一个数与的部分(a & b),在二进制序列里面就是两个数都为1的部分
这样的话我们直接与取出来的部分就是原来两个数二进制序列相加进一后移一位的部分
而((a ^ b) >> 1)则是两个数二进制序列不同的部分,这部分是需要除以2的,除以2以后均分到两个数,所以可以写成((a ^ b) / 2),效果相同
两部分相加,就得到我们的平均数,可以说这个求法是非常巧了
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<Windows.h> int ave1(int m, int n) { return (m + n) >> 1; } int ave2(int m, int n) { return (m&n) + ((m^n) >> 1); } int main() { int m = 0; int n = 0; scanf("%d %d", &m, &n); int r1=ave1(m, n); int r2=ave2(m, n); printf("%d %d", r1, r2); system("pause"); return 0; }
3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<Windows.h> int main() { int arr[] = { 1,1,5,5,7,7,8,9,9 }; int i = 0; int len = sizeof(arr) / sizeof(arr[0]); for (i = 1; i < len; i++) { arr[0] = arr[0] ^ arr[i]; } printf("出现一次的数字为:%d\n", arr[0]); 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<string.h> #include<Windows.h> #include<assert.h> void reverse(char *start, char *end) { assert(start);//assert() 的用法很简单,我们只要传入一个表达式,它会计算这个表达式的结果:如果表达式的结果为“假”,assert() 会打印出断言失败的信息,并调用 abort() 函数终止程序的执行;如果表达式的结果为“真”,assert() 就什么也不做,程序继续往后执行。 assert(end); while (start < end) { char temp = *start; *start = *end; *end = temp; start++; end--; } } void reverse_str(char *str, int sz) { assert(str);//检测传入的字符串 char *str1 = str; char *left = str; char *right = str + sz - 1; reverse(left, right);//先将字符串整体反转 while (*str1) { left = str1; while ((*str1 != '\0') && (*str1 != ' '))//找到单词,此处一定要加(*str1 !='\0')条件限制,因为找到最后一个单词时,*str1永远也不为空格 { str1++; } right = str1 - 1; reverse(left, right);//逆序整个单词 if (*str1 == ' ')//找到空格 str1++; } } int main() { char arr[] = "student a am i"; int sz = strlen(arr); reverse_str(arr, sz); printf("交换后:%s\n",arr ); system("pause"); return 0; }
11-25
1780
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-07
285
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)