1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
方法一:移位
unsigned int reverse_bit(unsigned int value)
{
unsigned int ret = 0;
for (int i = 0; i < 32; i++)
{
ret <<= 1;//保存上一位的结果
ret |= (value >> i) & 1;//把当前位保持在ret最低位
}
return ret;
}
方法二
unsigned int reverse_bit(unsigned int value)
{
int ret = 0;
for (int i = 0; i < 32; i++)
{
ret += ((value >> i) & 1)*pow(2, 31 - i);// 每一位反转之后的之相加
}
return ret;
}
int main(){
unsigned int value = 0;
printf("请输入一个值:");
scanf("%d", &value);
printf("%u\n", reverse_bit(value));
system("pause");
return 0;
}
2.不使用(a + b) / 2这种方式,求两个数的平均值。
第一种:移位 (a+b)>>1
第二种: a+((b-a)>>1)
第三种 & ^
两个数的平均值:两个数对应二进制位的平均
& 把相同的位找出来
^ 把不相同的位找出来
(a&b)+((a^b)>>1)
int average(int a, int b)
{
return (a + b) >> 1;
}
int main(){
int a = 0;
int b = 0;
printf("请输入两个数:");
scanf("%d %d", &a, &b);
printf("%d\n", average(a,b));
system("pause");
return 0;
}
3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
异或:对应位置1的个数为奇数,最终对应位结果为1
对应位置1的个数为偶数,最终对应位结果为0
int main()
{
int arr[] = { 1, 2, 3, 5, 3, 2, 1 };
int ret = 0;
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < len; i++)
{
ret ^= arr[i];
}
printf("%d",ret);
system("pause");
return 0;
}
4.
有一个字符数组的内容为:"student a am i",
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
student a am i
i ma a tneduts
i am a student
void reverse_str(char* left, char* right)//逆转left到right之间的字符串
{
while (left<right)
{
char temp = *left;
*left = *right;
*right = temp;
left += 1;
right -= 1;
}
}
int Strlen(char* str)//计算字符串长度
{
int count=0;
while (*str)
{
count ++;
str ++;
}
return count;
}
void reverse(char* str)
{
char* left = str;
char* right = str+Strlen(str) - 1;
char* cur = str;
//整体逆转
reverse_str(left,right);
printf("%s\n", str);
while (*cur)
{
//当前子川的起点
char* start = cur;
//获取当前子串尾点的下一个位置
while ((*cur != ' ') && (*cur != '\0'))
{
cur++;
}
reverse_str(start, cur-1);
if (*cur==' ')
{
cur++;
}
}
}
int main(){
char str[] = "student a am i" ;
printf("%s\n", str);
reverse(str);
printf("%s\n", str);
system("pause");
return 0;
}