1.unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
#include<stdio.h>
#include <math.h>
#include <windows.h>
unsigned int reverse_bit(unsigned int value)
{
int i = 0;
unsigned int Ret = 0;
for (i = 0; i < 32; i++)
{
if (!(value >> i))
{
break;
}
else if ( (value >> i) & 0x01)
{
Ret += pow(2, (31 - i));
}
}
return Ret;
}
int main()
{
unsigned int data = 0;
unsigned int Ret = 0;
printf("请输入一个数:\n");
scanf_s("%u", &data);
printf("翻转后的数为 :%u\n" ,reverse_bit(data));
system("pause");
return 0;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。
#include<stdio.h>
#include <windows.h>
int main()
{
double a = 0;
double b = 0;
double c = 0;
printf("请输入两个数: ");
scanf_s("%lf %lf", &a, &b);
c = a + ((a - b) / 2.0);
printf("平均数为%lf\n",c);
system("pause");
return 0;
}
3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
#include<stdio.h>
#include <math.h>
#include <windows.h>
int main()
{
int arr[9] = { 0 };
int i = 0;
int j = 0;
int a = 0;
printf("请输入4对相同的数字和一个单独不同的数字\n");
for (i = 0; i < 9; i++)
{
scanf_s("%d", &arr[i]);
}
for (i = 0; i < 9; i++)
{
a ^= arr[i];
}
printf("单独的数字是:%d\n", a);
system("pause");
return 0;
}
4.有一个字符数组的内容为:”student a am i”,请你将数组的内容改为”i am a student”.
要求:
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
#include<stdio.h>
#include <math.h>
#include <windows.h>
int main()
{
int i = 0;
int j = 0;
int R = 13;
int L = 0;
int k = 14;
char arr[14] = { "student a am i" };
char arr2[14] = { 0 };
for (i = 13; i >= 0; i--)
{
if (arr[i - 1] == ' ' || i == 0)
{
for (R = i; R < k;)
{
arr2[L++] = arr[R++];
}
k = i - 1;
arr2[L++] = ' ';
i--;
}
}
for(i = 0; i < 14 ;i++)
{
printf("%c", arr2[i]);
}
printf("\n");
system("pause");
return 0;
}