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;
}
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;
}