- 编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
分析题目,只需要将二进制中1的个数输出,并将1的位置从左到右反转后转为十进制的值即可。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
unsigned int reverse_bit(unsigned int num) {
int i = 0;
int arr[32];
int ret = 0;
unsigned int result = 0;
for(i=0;i<=31;++i) {
ret = (num>>i) & 1; //输出二进制中的1
if(ret==0) {
continue;
}
else {
arr[i] = ret; //将二进制位中的1与它相对应的位保存至数组中
}
result += (unsigned int)pow(2,31-i); //输出反转后的十进制数
}
return result;
}
int main() {
int num;
scanf("%d",&num);
printf("%u\n",reverse_bit(num));
system("pause");
return 0;
}
运行结果:
- 不使用(a+b)/2这种方式,求两个数的平均值。
#include <stdio.h>
#include <stdlib.h>
int main() {
int a,b;
int ret=0;
scanf("%d %d",&a,&b);
ret = (a+b)>>1;
printf("%d\n",ret);
system("pause");
return 0;
}
- 编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
#include <stdio.h>
#include <stdlib.h>
int main() {
int arr[] = { 1 , 8 , 8 , 6 , 7 , 7 , 6 , 9 , 1 };
int i=0;
for(i=1;i<len;++i) {
//异或运算 相同位0,相异为1
arr[0] = arr[0] ^ arr[i]; //自己异或自己还是等于自己 即1^8=9;9^8=1。
}
printf("The single num is :%d\n",arr[0]);
system("pause");
return 0;
}
- 有一个字符数组的内容为:“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 <assert.h>
//计算字符串长度
int len(char* str) {
int count = 0;
assert(str); //断言语句,前置条件断言:代码执行之前必须具备的特性
while(*str != '\0') {
count ++;
str ++;
}
return count;
}
//逆转函数
void reverse(char a[],int left,int right) {
while(left<right) {
char tmp = a[left];
a[left] = a[right];
a[right] = tmp;
left ++;
right --;
}
}
//逆转字符数组
char* reverse_str(char a[]) {
int i = 0;
int left = 0;
int right = len(a) - 1;
reverse(a,left,right);
while(a[i] != '\0') {
left = i;
while(a[i] != '\0' && a[i] != ' ') {
i++;
}
right = i - 1;
reverse(a,left,right);
if(a[i] != '\0')
i++;
}
return a;
}
int main() {
char a[] ="student a am i";
reverse_str(a);
printf("%s\n",a);
system("pause");
return 0;
}