1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
unsigned int reverse_bit(unsigned int value) {
int ret = 0;
int bit = 0;
for (int i = 0; i < 32; ++i)
{
ret = ret << 1;
bit = value & 1;
value = value >> 1;
ret = ret | bit;
}
return ret;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。
int aver(int num1,int num2) {
int tem = 0;
tem = num1 + (num2 - num1) / 2;
return tem;
}
3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
int Arr() {
int arr[9] = { 1,1,2,2,23,4,5,4,5, };
int tmp = 0;
for (int i = 0; i < 9; ++i) {
tmp = tmp ^ arr[i];
}
return tmp;
- 有一个字符数组的内容为:“student a am i”,
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
student a am i
i ma a tneduts
i am a student
char change(char arr[],int left,int right) {
while (left < right) {
char ch = arr[left];
arr[left] = arr[right];
arr[right] = ch;
++left, --right;
}
}
void reverse(char arr[]) {
int left = 0, right = strlen(arr) - 1;
change(arr, left, right);
int i = 0;
for (; arr[i]; ++i) {
if (arr[i] == ' ') {
right = i - 1;
change(arr,left,right);
left = i + 1;
}
}
right = i - 1;
change(arr, left, right);
printf("%s\n", arr);
}
main 方法如下:
int main() {
char arr[] = "student a am i";
printf("%d\n",Arr());
printf("%u\n", reverse_bit(25));
reverse(arr);
system("pause");
return 0;
}