数组交换元素和一种另类写法的比较 arr[a] ^ arr[b] 求中间值得一种巧妙算法 避免越界的求中值算法 位运算和算术运算的效率 一些细节

数组交换

在数组元素交换中,我们通常会拿一个临时的碗取装载临时链接,通常写法是这样的

    /**
     * 交换元素数组中两个下标元素的位置
     *
     * @param arr
     * @param a
     * @param b
     */
    public void swapA(int[] arr, int a, int b) {
        int tmp = arr[a];
        arr[a] = arr[b];
        arr[b] = tmp;
    }

那么在一些的也有这样写的方法

    /**
     * 交换元素
     *
     * @param arr
     * @param a
     * @param b
     */
    public static void swapB(int[] arr, int a, int b) {
        arr[a] = arr[a] ^ arr[b];
        arr[b] = arr[a] ^ arr[b];
        arr[a] = arr[a] ^ arr[b];
    }

通常情况下二者当a不等于b的时候两者的作用是一致的,

那么为什么说是通常情况下的,那么下面是个调试当a=b时查看两者的结果;

发现观察看方式B却改变的元素,自己替换自己的时候却发生了自身的内容,所以方式A和方式B是不等的,当然为了耍酷可以简单改写方式B为

    /**
     * 交换元素
     *
     * @param arr
     * @param a
     * @param b
     */
    public static void swapB(int[] arr, int a, int b) {
        // 这里不能删除,否则自己替换自己发生了改变
        if (a == b) {
            return;
        }
        arr[a] = arr[a] ^ arr[b];
        arr[b] = arr[a] ^ arr[b];
        arr[a] = arr[a] ^ arr[b];
    }

中值算法

这个常在二分法中用到,下面来观察下面求中间值的算法

A. (a+b)/2
B. a+(b-a)/2
C. (a+b)>>1
D. a+(b-a)>>1

我们知道算术运算/2和位运算>>1效果上一致的,但在效率上而言,位运算是远大于算术运算;

a+b可能存在越界,即int+int>int 但 a+(b-a)>>1就不会越界,可以分a是大还是小去讨论结果都不会越界,当a大的时候,后面的结果为负a佳航绝对值比自己小的负值是不会越界的,当a小时则更不可能,所以D时最好的实现,既能防越界,也有更好的运算效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

若光672

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

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

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

打赏作者

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

抵扣说明:

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

余额充值