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