1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
思路,先找出其二进制数位有哪些项为1,
然后再把这些为1的项通过移位操作符进行翻转。
unsigned int reverse_bit(unsigned int value)
{
int i = 0;
unsigned int sum = 0;
for (i = 0; i < 32; i++)
{
int t = 0;
if (((value >>i)&1) == 1)
{
t = 31 - i;
sum = sum + (1<<t);
}
}
return sum;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。
思路,通过右移操作符来代替除2运算。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d", &a, &b);
c = a + b;
c = c >> 1;
printf("%d", c);
system("pause");
return 0;
}
3.编程实现:
一组数据中只有一个数字出现一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
通过异或的手段来判断
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 0;
int a = 0;
int arr[5] = { 2,2,4,5,5 };
for (i = 0; i < 5; i++)
{
a = a ^ arr[i];//两相同的数异或为0,0与一个数异或为其本身。
}
printf("%d", a);
system("pause");
return 0;
}
4.有一个字符数组的内容为:“student a am i”,
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
思路,先将求原字符串的逆序字符串,
然后再把其中的单词单词进行求逆序即可。
#include<stdio.h>
#include<stdlib.h>
int main()
{
char arr[14] = "student a am i";
char arr1[14] = { 0 };
char arr2[14] = { 0 };
int i = 0;
int j = 0;
int t = 0;
for(i=0,j=13;i<=6,j>=7;i++,j--)
{
arr1[i] = arr[j];
arr1[j] = arr[i];
}
arr2[0] = arr1[0];
arr2[1] = arr1[1];
for (i = 2;i <= 3; i++)
{
arr2[i] = arr1[5 - i];
}
arr2[4] = arr1[4];
arr2[5] = arr1[5];
arr2[6] = arr1[6];
for (j = 7; j <= 13; j++)
{
arr2[j] = arr1[20 - j];
}
for (t = 0; t < 14; t++)
{
printf("%c", arr2[t]);
}
system("pause");
return 0;
}