1.
.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
/* 1.编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回值value的二进制位模式从左到右翻转后的值。 如: 在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 10011000000000000000000000000000 程序结果返回: 2550136832 */ #include<stdio.h> #include<windows.h> /*value的二进制序列共32位,而b的值是从第一位开始左移的,故只能循环31次。*/ int reverse_bit1(unsigned int value) { int a = 0; int b = 0; int i = 1; for (; i < 32; i++) { a = value & 1; //取value的最后一位 value = value >> 1; //value的数值右移,取前一位 b = a | b;//将a(value)的最后一位赋给b b = b << 1;//b左移一位,空出最后一位给value的最后一位 } return b; } int reverse_bit2(unsigned int value) { int a = 0; int b = 0; int i = 1; for (; i <= 32; i++) { a = value & 1;//将value的最后一位赋给a if (1 == a) b |= (1 << (32 - i));//直接将value中的数按位置准确放入b中 value = value >> 1; } return b; } int main() { printf("%u\n", reverse_bit1(25)); printf("%u\n", reverse_bit2(25)); system("pause"); return 0; }
2.
.不使用(a+b)/2这种方式,求两个数的平均值。
#include<stdio.h> #include<windows.h> /* (a + b) / 2 ,存在溢出*/ int add_1(int a, int b) { return (a + b) >> 1; } int add_2(int a, int b) { if (b > a) { a ^= b; b ^= a; a ^= b; } return b + ((a - b) >> 1); } /*用a和b相同的部分加上a和b不同的地方, a和b相同的部分为(a&b), a和b不同的部分为(a^b),不同的部分除以二就是(a^b>>1) */ int add_3(int a, int b) { return (a&b) + ((a^b) >> 1); } int main() { printf("%u\n",add_1(12,4)); printf("%u\n",add_2(4,12)); printf("%u\n", add_3(4, 12)); system("pause"); return 0; }
3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
#include <stdio.h> #include <windows.h> int main() { int arr[] = { 1, 5, 5, 1, 7, 6, 7, 8, 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];//^异或运算符,相异为1想同为0. } printf("%d\n", arr[0]); system("pause"); return 0; }
4.
有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
要求:
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
要求:
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
这个题要求不能使用库函数,那就可以自己写一个strlen函数。
做这个题的思路就是:先将整个字符串反转过来,然后再对单个单词进行反转。
做这个题的思路就是:先将整个字符串反转过来,然后再对单个单词进行反转。
#include<stdio.h> #include<assert.h> #include <windows.h> void reverse(char *start, char *end) { assert(start); assert(end); while (start < end) { /*char temp = *start; *start = *end; *end = temp;*/ *start ^= *end; *end ^= *start; *start ^= *end; start++; end--; } } int my_strlen(char *str)//得到数组长度定义求取字符串长度的函数 { int count = 0; while (*str++) { count++; } return count; //返回count指向int型的具体值 } 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; //此时str1指向单词后方的空格,需要减一方能指向单词的最后一个字母 reverse(left, right); //继整体反转后再次反转单词,能使单词拼写顺序恢复过来 if (*str1 == ' ') //等于空格让指针后移一位否则不能参与下次循环。 { str1++; } } } int main() { char arr[] = "student a am i"; int sz = my_strlen(arr); reverse_str(arr, sz); printf("%s\n", arr); system("pause"); return 0; }