编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值是value的二进制位模式从左到右翻转后的值。
这是一个相对笨蛋,但是好理解的方法。创建一个数组,使用循环将value%2放入数组每一位中,然后倒着遍历数组,每次将数组成员乘相对于的2的次方,得到最后的值。
#include<stdio.h>
#include<Windows.h>
#include<math.h>
unsigned int reverse_bit(unsigned int value){
unsigned int sum = 0;
unsigned int a = 0;
unsigned int revers[32];
for (int i = 0; i < 32; i++){
revers[i] = value % 2;
value >>= 1;
}
for (int j = 31; j >= 0; j--){
a = revers[31 - j] * pow(2.0, j);
sum += a;
}
return sum;
}
int main(){
unsigned int val = 25;
printf("%d \n" ,reverse_bit(val));
system("pause");
return 0;
}
不使用(a+b)/2这种方式,求两个数的平均值
这里运用按位异或,按位与操作,先按位异或,再右移操作,最后加上按位与的值,补上进位的值。
#include<stdio.h>
#include<Windows.h>
int Average(int x, int y){
int sum = 0;
sum = (x ^ y) >> 1;
sum += x & y;
return sum;
}
编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
这里使用的思想非常简单,但是实现非常麻烦,是非常傻瓜,没有任何技巧的代码。
另创建两个数组,一个数组用来原数组中不重复的数,另一个数组用来存放遍历过程中,出现过的成对数,这样既找出了成对的数又找出了不成对的数。创建成对出现数的数组ret[]的主要目的是,当遍历循环嵌套遍历,跳过两个成对数的前一个的时候,在遍历到第二个数时,往后不会有重复的数出现,会把第二次出现的成对数放入目的数组中去,所以为了避免这种情况,建立了成对数据的数组,在最后赋值的时候做检验。代码的判断和循环语句较多,临时变量也很多,能实现功能,但不见得最优。
#include<stdio.h>
#include<Windows.h>
void FindDiff(){
int arr[] = { 1, 2, 3, 1, 3, 5, 4, 7, 7 };
int length = sizeof(arr) / sizeof(arr[0]);
int b[10]; //目的数组
int k = 0; //目的数组的元素个数
int ret[10]; //成对数组
int r = 0; //成对数组的元素个数
for (int i = 0; i < length; i++)
for (int j = i + 1; j < length; j++){
if ((arr[i] ^ arr[j]) == 0){
ret[r] = arr[i];
r++;
break;
}
if (j == length - 1){
int flag = 0; //标记值 为0时才给目标数组赋值
for (int s = 0; s < r; s++){
if (ret[s] == arr[i])
flag++;
}
if (flag == 0){
b[k] = arr[i];
k++;
}
}
}
for (int p = 0; p < k; p++)
printf("%d ", b[p]);
}