1.unsigned int reverse_bit(unsigned int value);
这个函数的返回值是value的二进制位模式从左到右翻转后的值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
unsigned int reverse_bit(unsigned int value)
{
int ret = 0;
int tmp = 0;
for (int i=0; i < 32; i++)
{
ret = ret << 1;//左移一位,保存前一位
tmp = value & 1;//取出最后一位
value = value >> 1;//值右移, 取下一位
ret = ret | tmp;//最后一位赋给ret
}
return ret;
}
int main()
{
int input = 0;
printf("请输入一个数字:\n");
scanf("%d", &input);
printf("%u\n",reverse_bit(input));
system("pause");
return 0;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。
#include<stdio.h>
#include<stdlib.h>
int Avg_Num(int a, int b)
{
int num = 0;
num = (b - a) / 2 + a;
return num;
}
int main()
{
int a, b;
printf("请输入两个数字:\n");
scanf_s("%d %d", &a, &b);
printf("%d\n",Avg_Num(a, b));
system("pause");
return 0;
}
右移操作符相当于除以2
int Avg_Num(int a, int b)
{
return ((a&b) + ((a^b) >> 1));
}
3.编程实现:
一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
0异或任何数为任何数,
相同数字异或为0
int Seek_num(int arr[],int len)
{
int ret = 0;
for (int i = 0; i < len; i++)
{
ret = ret^arr[i];
}
return ret;
}
int main()
{
int arr[] = { 2, 2, 3, 4, 5, 7, 3, 5, 4 };
int len = 0;
len = sizeof(arr) / sizeof(arr[0]);
printf("%d\n",Seek_num(arr,len));
system("pause");
return 0;
}
4.有一个字符数组的内容为:“student a am i”,
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
看到题先分析应该用两次逆序,第一次得到"i ma a tneduts",之后再将每个空格隔开的字符串再次逆序得到 “i am a student”
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 = strlen(str);
reverse(str, str + len - 1); //全部逆置
while (*str != '\0')
{
char* pos = str;
while ((*str != ' ') && (*str != '\0'))
{
str++;
}
reverse(pos, str - 1); //每个单词的逆置
if (*str != '\0')
{
str++;
}
}
}
int main()
{
char str[] = "student a am i";
printf("原字符串为:%s\n", str);
str_reverse(str);
printf("翻转后的字符串为:%s\n", str);
system("pause");
return 0;
}