Work_9
编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> //按二进制翻转 unsigned int Reverse_bit(unsigned int value){ //法一: //从左找到第一个为1的二进制数的位置 int count = 0; for (int i = 31; i > 0; i--){ int temp; //当其二进制的某一位为1时,和1与为1 temp = value & (1 << i); count++; if (temp != 0){ break; } } unsigned int sum = 0; unsigned int temp; int i = 32 - count; for (; i >= 0; i--){ //从左数,将第一个“1”提出来(除它以外,全部变成0) //通过循环,继续将后续的数依次提出来 temp = value & (1 << i); //减去它后面位数的二倍,再将此数放于第一位:0010 => 01 => 10 temp = temp << (32 - i * 2 - 1); //通过循环,将这些数加起来 sum = sum + temp; } return sum; ////法二: //unsigned int sum = 0; //int i = 1; //for (i = 1; i <= 32; i++){ // //判断该位是否为1 // unsigned int cur = value >> (i - 1) & 1; // //第1位翻转后为2 ^ 31 , 第2位翻转后为2 ^ 30, // //第i位翻转后位2 ^ (32 -1) // sum += cur * pow(2, 32 - i); //} //return sum; } int main(){ unsigned int input; printf("请输入一个整数:"); scanf("%u", &input); printf("翻转后的整数为:"); printf("%u", Reverse_bit(input)); printf("\n"); system("pause"); return 0; }
不使用(a+b)/2这种方式,求两个数的平均值。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> //求平均数 void Average(int a, int b){ //获得两个数的差值 int temp = a > b ? (a - b) : (b - a); //平均数 = 差值的一半加上较小的那个数 int aver = a > b ? (b + temp / 2) : (a + temp / 2); printf("这两个数的平均数为:%d", aver); } int main(){ int a, b; printf("请输入两个整数:\n"); scanf("%d %d", &a, &b); Average(a, b); printf("\n"); system("pause"); return 0; }
编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> //找单一的数字 int Number(int arr[], int size){ int sign = arr[0]; //将数组中的每一个数都进行与或, //成双的数字与或为0,则留下的数字为单一的数字 for (int i = 1; i < size; i++){ sign = sign ^ arr[i]; } return sign; } int main(){ int arr[11] = { 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5 }; int size = sizeof(arr) / sizeof(arr[0]); int result = 0; result = Number(arr, size); printf("出现一次的数据为:%d", result); printf("\n"); system("pause"); return 0; }
有一个字符数组的内容为:"student a am i",
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
如:
student a am i
i ma a tneduts
i am a student
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> //字符串的整体逆转 void Reverse_string(char* start, char* end){ while (start < end){ char temp = *start; *start = *end; *end = temp; start++; end--; } } //求字符串长度 int Mystrlen(char* str){ int count = 0; while (*str){ count++; str++; } return count; } //逆转字符串 void Mystring(char* str){ char* start = str; char* end = str + Mystrlen(str) - 1; //整体逆转 Reverse_string(start, end); //局部逆转 char* cur = str; while (*cur){ char* sub_start = cur; while ((*cur != ' ') && (*cur != '\0')){ cur++; } char* sub_end = cur - 1; //逆转字串 Reverse_string(sub_start, sub_end); while (*cur == ' '){ cur++; } } } int main(){ char* str[1024]; //scanf("%s", str); //scanf函数在读取字符串时,当遇到空格时会停止读取 gets(str); Mystring(str); printf("%s", str); printf("\n"); system("pause"); return 0; }