csapp-ex2.11

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
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

味堡o_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值