2018.1.7
1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回 值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
#include<stdio.h>
#include <math.h>
unsigned int reverse_bit(unsigned int value)
{
unsigned int a[32]={0};
unsigned int val = value;
int number = 0;
int i = 0;
while(number<32)
{
a[number]= val & 1;
val = val >>1;
// printf("%d ", a[number]);
number++;
}
// printf("\n");
val = 0;
i = 0;
number = 31;
while(i<32)
{
val= val + a[number--]*(int)pow(2, i++);
}
return val;
}
int main(){
unsigned int a;
a = reverse_bit(25);
printf("%u\n",a);
return 0;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(){
int a = 0, b = 0;
int head = 0, tail = 0;
scanf("%d %d", &a, &b );
head = a;
tail = b;
while(head<=tail)
{
head++;
tail--;
}
if (head==tail)
{
printf("%d", head);
}
else printf("%d", (tail+head)/2);
return 0;
}
3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(){
char s[50];
int i;
char a;
scanf("%s",s);
a=s[0];
for(i=1; i<strlen(s); i++)
{
a = ~(a^s[i]);
}
printf("%c\n",a);
return 0;
}
4.有一个字符数组的内容为:”student a am i”,请你将数组的内容改为”i am a student”.
要求:
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int GetLength(char s[])
{
int i=0;
char c=' ';
while(c!='\0')
{
c= *(s++);
i++;
}
return i-1;
}
void OverTurn(char s[], int start, int end)
{
char c=' ';
int i=start;
int j=end;
while(i<j)
{
c=s[i];
s[i]=s[j];
s[j]=c;
i++;
j--;
}
}
int main(){
char source[]="student a am i";
int i=0;
int start=0, end=-2;
for(i=0; i<GetLength(source); i++)
{
if (source[i]==' ')
{
start = end+2;
end = i-1;
OverTurn(source, start, end);
}
}
OverTurn(source, 0, GetLength(source)-1);
printf("%s", source);
return 0;
}