编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值:
#include<stdio.h> unsigned int Reverse_bit(unsigned int value) { int i = 0; unsigned int b = 0; int tmp = 0; for (i = 0; i < 32; i++) { tmp = ((value >> i) & 1); b = (b << 1) + tmp; } return b; } int main() { int a = 25; unsigned int ret = 0; ret=Reverse_bit(a); printf("%u\n", ret); return 0; }
不使用(a+b)/2这种方式,求两个数的平均值:
#include<stdio.h> int main() { int a = 0; int b = 0; scanf("%d%d", &a, &b); printf("%d\n", (a + b) >> 1); return 0; }
编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算):
#include<stdio.h> int main() { int i = 0; int j = 0; int count = 0; int arr[] = { 1, 2, 3, 2, 3, 5, 7, 9, 1, 7, 9 }; int l = sizeof(arr) / sizeof(arr[0]); for (i = 0; i < l; i++) { count = 0; for (j = 0; j < l; j++) { if (arr[i] == arr[j]) count++; if (count == 2) break; } if (count == 1) { printf("%d\n", arr[i]); } } return 0; }
有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
要求:
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关):
#include<stdio.h> #include<string.h> int Zkg(char arr[], int l, int right) { int i = 0; for (i = right + 1; i <= l; i++) { if (arr[i] == ' ') return i; } return l; } int Ykg(char arr[],int l,int left) { int i = 0; for (i = left + 1; i <= l; i++) { if (arr[i] == ' ') return i; } return l; } int main() { int zuo = 0; int you = 0; int l = 0; int left = 0; int right = 0; char arr[50] = { "student a am i" }; l = strlen(arr)-1; right = l; left = 0; while (right>left) { char tmp = 0; tmp = arr[right]; arr[right] = arr[left]; arr[left] = tmp; right--; left++; } printf("%s\n", arr);zuo = 0; zuo = Zkg(arr, l, zuo); while (zuo != l) { you = Ykg(arr, l, zuo); left = zuo + 1; if (you != l) { right = you - 1; } else { right = you; } while (right>left) { char tmp = 0; tmp = arr[right]; arr[right] = arr[left]; arr[left] = tmp; right--; left++; } zuo = you; } printf("%s\n", arr); return 0; }