每日一题位运算交换两数

Posted 唐宋xy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题位运算交换两数相关的知识,希望对你有一定的参考价值。

题目

如何不使用额外变量交换两个数

解析

如果可以使用额外变量,那么交换两个数是非常简单的,但是不能使用额外变量的话,就需要通过神奇的位运算来实现了,具体的代码也非常简单

  • 代码实现
a = a ^ b;
b = a ^ b;
a = a ^ b;
public static void swap (int[] arr, int i, int j) 
    arr[i]  = arr[i] ^ arr[j];
    arr[j]  = arr[i] ^ arr[j];
    arr[i]  = arr[i] ^ arr[j];

特别注意:如果是对于相同位置的数进行交换,那么不能使用位运算的方式,因为会导致该位置上的数计算为0

异或运算:相同为0,不同为1

  • 为什么

    因为异或运算的性质是满足交换律和结合律的,所以上面的公式可以表达为:

    a = a ^ b;
    b = a ^ b; -> b = a ^ b ^ b; // 因为上面已经将a重新赋值了,所以将a拆为上面的表达式,因为异或运算相同为0,并且0^任何数=任何数,所以这里b = a ^ (b ^ b) -> b = a;
    a = a ^ b; -> a = a ^ b ^ a; // 第一步中 a = a ^ b的,第二种已经将b计算了为a,那么这里拆分为 a = a ^ b ^ a; 通过交换律得到 a = (a ^ a) ^ b -> a = b;
    
    

以上是关于每日一题位运算交换两数的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:23. 两数相除

《LeetCode之每日一题》:176. 两数相除

力扣每日一题 371. 两整数之和 (如何不用+和-让两数相加)

《LeetCode之每日一题》:273.两数之和

《LeetCode之每日一题》:141.两数相加

每日leetcode一题两数相加