1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
2.不使用(a+b)/2这种方式,求两个数的平均值。
3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
有一个字符数组的内容为:“student a am i”,
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
1.
#include<stdio.h>
void my_reverse(char* pb,char* pe)
{
while(pb < pe)
{
char t = *pb;
*pb = *pe;
*pe = t;
pb++;
pe--;
}
}
void reverse(char* cur)
{
char* ret = cur;
char* pb = cur;
char* pe = cur;
while(*pe != '\0')
{
pe++;
}
pe--;
my_reverse(pb,pe);
while (*cur)
{
char* end = NULL;
char* start = cur;
while ((*cur != ' ') && (*cur != '\0'))
{
cur++;
}
//找到空格
end = cur-1;
my_reverse(start,end);//逆序单个单词
if (*cur == ' ')
cur++;
}
printf("%s",ret);
}
int main()
{
char arr[] = "i am a student.";
reverse(arr);
return 0;
}
2.
#include<stdio.h>//**方法一**
#include<math.h>
int main()
{
int i = 0;
int sum = 0;
int a = 0;
int n = 0;
printf("请输入你要转换的数字\n");
scanf("%d",&n);
for(i = 0; i < 32; i++)
{
a = ((n>>i)&1);
sum = sum + a * pow(2,31-i);
}
printf("%u",sum);
return 0;
}
#include<stdio.h>//**方法二**
int print(unsigned int n)
{
int value = 0;
int i = 0;
int m = 0;
for(i = 0; i < 32; i++)
{
value = value<<1;
m = (n>>i)&1;
value = m^value;
}
return value;
}
3.
#include<stdio.h>
int main()
{
int a = 5;
int b = 7;
int aver = 0;
aver = (a & b)+((a ^ b)>>1);
printf("%d",aver);
return 0;
}
4.
#include<stdio.h>
int main()
{
int i = 0;
int ret = 0;
int arr[5] = {1,2,3,2,1};
for(i = 0; i < 5; i++)
{
ret^=arr[i];
}
printf("%d\n",ret);
return 0;
}