csapp
exercise2.11
#include<stdio.h>
void inplace_swap(int *a,int *b){
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
void show_array(const int *array,int len){
for (int i = 0; i < len;i++)
printf("%d ", array[i]);
printf("\n");
}
void reverse_array(int *array,int n){
int first = 0, last = n - 1;
for (; first < last;first++,last--){
inplace_swap(&array[first], &array[last]);
}
}
int main()
{
int a[4] = {1, 2, 3, 4};
int b[5] = {6, 7, 8, 9, 10};
printf("before reverse:");
show_array(a, 4);
reverse_array(a, 4);
printf("after reverse:");
show_array(a, 4);
printf("\n");
printf("before reverse:");
show_array(b, 5);
reverse_array(b, 5);
printf("after reverse:");
show_array(b, 5);
}
原书中for循环中判断逻辑为
first <= last
,这会导致当数组元素个数为奇数时发生错误,比如逆置到中间元素时中间元素产生0,这是因为逆置中间元素时索引first==last
,而交换的原理的a^b
,也就是exclusive-or(xor
),下面时xor
运算的一些技巧。
a^a=0
a^0=a
a^1=!a
a^(a^b)=b