1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
unsigned int reverse_bit(unsigned int x)
{
unsigned int y=0;
int tmp=0;
int n=0;
for (n=0;n<32;n++)
{
tmp=x&1;
y<<=1;
y|=tmp;
x>>=1;
}
return y;
}
int main()
{ unsigned int x=0;
printf("请输入一个整型数:\n");
scanf("%d",&x);
printf("该数二进制序列的逆序值为%u\n",reverse_bit(x));
return 0;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_average(int x,int y)
{
x>>=1;
y>>=1;
return (x+y);
}
int main()
{
int x=0;
int y=0;
printf("请输入2个整型数:\n");
scanf("%d%d",&x,&y);
printf("%d\n",my_average(x,y) );
return 0;
}
3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int search(int arr[],int sz)
{ int i=0;
int tmp=0;
for (i=0;i<sz;i++)
{
tmp=tmp^arr[i];
}
for (i=0;i<sz;i++)
{
if(tmp==arr[i])
return i;
}
return sz+1;
}
int main()
{
int n=0;
int arr[]={1,2,3,3,2};
int sz=sizeof (arr)/sizeof(arr[0]);
n=search(arr,sz);
if (n>sz+1)
{
printf("该组数据中没有单独的数据\n");
}
else
printf("该组数据中单独的数据是%d\n",arr[n]);
return 0;
}
有一个字符数组的内容为:“student a am i”,请你将数组的内容改为"i am a student".
要求:
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strlen(char arr[])
{
int i=0;
for (i=0;arr[i]!='\0';i++)
{
;
}
return i;
}
int main()
{
char arr[]={"student a am i"};
char arr1[20][20]={0};
int i=0;
int j=0;
int n=0;
int sz=my_strlen(arr);
while (1)
{
for (j=0;(arr[n]!=' ')&&(n<sz);n++,j++)
{
arr1[i][j]=arr[n];
}
arr1[i][j]='\0';
if (n==sz)
{
break;
}
i++;
n++;
}
for (;i>=0;i--)
{
printf("%s ",arr1[i]);
}
return 0;
}