经典练习

来源:互联网 发布:mac运行windows 发热 编辑:程序博客网 时间:2024/05/22 00:15
1.编写函数: 
unsigned int reverse_bit(unsigned int value); 
这个函数的返回值value的二进制位模式从左到右翻转后的值。 

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

#include<stdio.h>
#include<stdlib.h>
unsigned int reverse_bit(unsigned int X)
{
int ret = 0;
int i = 0;
int bit = 0; 
for(i=0;i<32;i++)
{
ret=ret<<1;//左移一位,保存前一位
bit=X&1;//取出最后一位
X=X>>1;//值右移一位
ret=ret|bit;//ret前面的保持不变,将取出X的最后一位赋给ret
}
return ret;
}
int main()

int x=0;
int ret = 0;
scanf("%d",&x);
ret=reverse_bit(x); 
printf("%u\n",ret);
system("pause");
return 0;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。 

#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
printf("a+b=%d\n",((a&b)+((a^b)>>1)));
system("pause");
return 0;
}
3.编程实现: 
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 
请找出这个数字。(使用位运算) 
#include<stdio.h>
#include<stdlib.h>
#define SZ sizeof(arr)/sizeof(arr[0])
int main()


{
int arr[9]={1,2,3,4,1,2,3,4,5};
int i = 0;
int j = 0; 
for(i=0;i<SZ;i++)
{
j=j^arr[i];
}
if(j==0)
printf("%d成对出现\n",j);
else
printf("%d单独出现\n",j);
system("pause");
return 0;
}
4. 
有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student". 
要求: 
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
void rvrse_msg(char *start,char* end)
{
while(start<end)
{
char temp=0;
temp=*start;
*start=*end;
*end=temp;
end--;
start++;
}
}
void exchange_msg(char *msg,int sz)
{
char *fast=msg;//定义一个快指针一个慢指针
char *slow=msg;
while(*fast!='\0')
{
if(isspace(*fast))//如果快指针为空格,停下来,快指针指向的前一个和慢指针指的进行交换
{
rvrse_msg(slow,fast-1);
fast++;//一个单词进行完后进行下一个单词的交换
slow=fast;//慢指针和快指针同一个位置
}
else
{
fast++;
}
}
rvrse_msg(slow,fast-1);//实现最后一个单词的内容互换
rvrse_msg(msg,fast-1);//整体的单词互换
}
int main()
{
char msg[]="student a am i";
int sz=sizeof(msg)/sizeof(msg[0]);
exchange_msg(msg,sz);
printf("%s",msg);
system("pause");
return 0;
}
原创粉丝点击