C语言模拟练习(8)

1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。


如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832

#include<stdio.h>
unsigned int reverse_bit(unsigned int value)
{
int sum = 0;
int bit = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
sum = sum << 1;
bit = value & 1;
sum = sum | bit;
value = value >> 1;
}
return sum;
}
int main()
{
printf("%u",reverse_bit(25));
getchar();
return 0;
}


2.不使用(a + b) / 2这种方式,求两个数的平均值。
#include<stdio.h>
int main()
{
int a = 12;
int b = 10;
int sum = (a + b) >> 1;
printf("%d",sum);
getchar();
return 0;
}
3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)

#include<stdio.h>
int main()

int arr[] = {1 ,3 ,2 ,5 ,2 ,3 ,1};
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 1; i < sz; i++)
{
arr[0] = arr[0] ^ arr[i];
}
printf("%d", arr[0]);
getchar();
return 0;
}
4.有一个字符数组的内容为:"student a am i", 请你将数组的内容改为"i am a student".
要求:
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。

#include <stdio.h>
#include<assert.h>


int my_strlen(const char *str)//防止首地址被改变
{
int len = 0;
while(*str++)
{
len++;
}
return len;
}
void reverse(char *start, char *end)
{
while(start<end)
{
char  tmp= *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
void str_reverse(char*str)
{
int len = my_strlen(str);
reverse(str, str + len - 1);
while(*str != '\0')
{
char*p= str;
while((*str != '?') && (*str != '\0'))//最后进行判断,首地址改变不受影响
{
str++;
}
reverse(p, str - 1);
if(*str != '\0')  
{
*str = ' ';   //将指针所指向内容进行赋值
str++;
}
}
}
int main()
{
char str[]= "student?a?am?i";
str_reverse(str);
printf("%s\n", str);
getchar();
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值