1.1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
个人理解:通过移位操作符,先循环移位操作32次将 int 类型变成二进制然后每一位拿出对应存入相应的新的数组
对应的位置。
unsigned int reverse_bit(unsigned int value){
int arr[32] = { 0 };
printf("反转前 (24)0 0000 1010\n");
for (int i = 0; i < 32; i++){
if (((value >> i) & 1) == 1){
arr[i] = 0;
}
else{
arr[i] = 1;
}
}
printf("反转后 (24)1 1111 0101\n");
int ret = 0;
int j = 0;
for (j = 0; j < 32; j++){
ret += arr[j] * pow(2, 32 - j);
}
return ret;
}
经过检验这个方法不符合题意无效
<方法一>将将数字循环32次 循环通过位操作符循环拿出右侧第一位存入对应的 32-i 处,后SUM+=求出求出结果
unsigned int reverse_bit_1(unsigned int value){
int i = 0;
int sum = 0;
for (i = 0; i < 32; i++){
sum += ((value >> i) & 1) << (32 - i);
}
return sum;
}
<方法二>与方案一大体相同,利用 与和 运算 求出结果
unsigned int reverse_bit_1(unsigned int value){
int i = 0;
int sum = 0;
for (i = 0; i < 32; i++){
sum += ((value >> i) & 1) << (32 - i);
}
return sum;
}
2.不使用(a+b)/2这种方式,求两个数的平均值。
本题简单题型 在C语言中 左移位1 相当于乘2 右移1位 相当于除2
int Average(int a,int b){
int aver = 0;
aver = (a + b) >> 1;
return aver;
}
int Average_1(int a, int b){
return b + ((a - b) >> 1);
}
int Average_2(int a,int b){
return (a&b) + ((a^b) >> 1);
}
3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)
int Find(int arr[]){
int i;
for (i = 1; i < 5; i++){
arr[0] = arr[0] ^ arr[i];
}
return arr[0];
}
4.
有一个字符数组的内容为:"student a am i",
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
student a am i
i ma a tneduts
i am a student
void reverse(char *start, char *end){ //倒置整个大字符串
assert(start);
assert(end);
while (start < end){
char temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
void reverse_string(char *str, int sz){
assert(str);
char *str1 = str;
char *left = str;
char *right = str + sz - 1;
reverse(left, right);
while (*str1){
left = str1; //数组的首地址 传给left
while ((*str1 != '\0') && (*str1 != ' ')){ //判定 找到最后一个单词时停止条件
str1++;
}
right = str1 - 1; //str1 指向单词后方的空格,需要减一方指向单词最后一个字母
reverse(left, right); //继整体反转之后 反转每个单词
if (*str1 == ' '){ //让指针后移一位
str1++;
}
}