与位运算相关的一些题型。
1.编写函数,这个函数的返回值value的二进制位模式从左到右翻转后的值。
方法一
#include <stdio.h>
unsigned int reverse_bit(unsigned int value)
{
int sum = 0;
int i = 0;
int bit = 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\n", reverse_bit(25));
system("pause");
return 0;
}
方法二
#pragma warning(disable:4996)
#include <stdio.h>
int bitReverse(int x)
{
int data = 0;
int num = sizeof(int)* 8;
int i = 0;
while (i < num)
{
if ((x >> i) & 1)
{
data |= 1 << (31 - i);
}
i++;
}
return data;
}
int main()
{
int data = 0;
printf("Please Enter Data:");
scanf("%d", &data);
printf("reverse data:%u\n", bitReverse(data));
system("pause");
return 0;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。
#include <stdio.h>
int main()
{
int a = 2;
int b = 4;
int average = (a&b) + ((a^b) >> 1);
//int average = a + (b - a) / 2;
printf("%d\n", average);
system("pause");
return 0;
}
3.编程实现:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的,请找出这个数字。(使用位运算)
#include <stdio.h>
int main()
{
int a[] = { 1, 2, 3, 2, 1 };
int i = 0;
int t = 0;
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
t ^= a[i];
}
printf("%d\n", t);
system("pause");
return 0;
}
4.有一个字符数组的内容为:"student a am i",请你将数组的内容改为:"i am a student".要求不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)
#include <stdio.h>
#include <assert.h>
void reverse(char* start, char* end)
{
while (start < end)
{
*start ^= *end;
*end ^= *start;
*start ^= *end;
start++;
end--;
}
}
void strReverse(char* str)
{
assert(str);
char* p = str;
char*q = p;
while (*p)
{
if (isspace(*p))
{
reverse(q, p - 1);
p++;
q = p;
}
else{
p++;
}
}
reverse(q, p - 1);
reverse(str, p - 1);
}
int main()
{
char str[] = "student a am i";
strReverse(str);
printf("res string:%s\n", str);
system("pause");
return 0;
}