C语言远征第十一天
1.编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
unsigned int reverse_bit(unsigned int value)
{
unsigned int sum = 0;
int arr2[50] = { 0 };
for (int i = 0;i < 32; ++i)
{
arr2[i] = value % 2;
value = value / 2;
}
for (int j = 31; j >= 0; --j)
{
if (arr2[j])
{
sum += (unsigned int)pow(2.0,31-j);
}
}
return sum;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。
int average(int x, int y)
{
int ave = 0;
ave = (x + y) >> 1;
return ave;
}
3. 编程实现: 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。(使用位运算)
int arr1[] = { 1,1,4,5,8,2,5,4,2 };
int size = sizeof(arr1) / sizeof(arr1[0]);
int count = 0;
for (int i = 0; i < size ; ++i)
{
for (int j = 0;j <size;++j)
{
if (!(arr1[i] ^ arr1[j]))
{
count++;
}
}
if (count == 1)
{
printf("%d", arr1[i]);
}
count = 0;
}
4.有一个字符数组的内容为:“student a am i”, 请你将数组的内容改为"i am a student".
要求: 不能使用库函数。 只能开辟有限个空间(空间个数和字符串的长度无关)。
student a am i
i ma a tneduts
i am a student
void reverse_str(char str[],int size)
{
int left = 0;
int right = size - 1;
while (1)
{
if (left < right)
{
Swap(&str[left], &str[right]);
left++;
right--;
}
else
{
break;
}
}
}
void new_reverse(char str[], int size)
{
int left = 0;
int right = 0;
for (int i = 0; i <= size; ++i)
{
if (str[i] == ' ' || str[i] == '\0')
{
right = i - 1;
while (1)
{
if (left < right)
{
Swap(&str[left], &str[right]);
left++;
right--;
}
else
{
break;
}
}
left = i + 1;
}
}
}
int main()
{
char str1[] = "student a am i";
int size = strlen(str1);
reverse_str(str1, size);
new_reverse(str1, size);
for (int i = 0; i < size; ++i)
{
printf("%c", str1[i]);
}
system("pause");
return 0;
}
hold on!!!