异或交换两数

从左神算法视频里get到一个小技巧:

通过异或运算来交换两数

看上去瞬间逼格高了不少

int a=11;
int b=12;
int temp=a^b;
a=temp^a;
b=temp^b

其实原理很简单,

先科普(小白请看)一下异或运算

两个二进制数异或运算 同位上相同时为0 不同时为1;

(同或运算则相反,相同为1,不同为0)

所以上面 a=temp^a=a^a^b=0^b;

0异或任何数=异或的那个数本身;

所以我们就完成了两个数的交换;

原文地址:https://www.cnblogs.com/pszp/p/9749247.html

时间: 2024-10-14 19:31:09

异或交换两数的相关文章

异或交换两个数;实现pow(int x, int y) ,即x的y次方

问题1:异或交换两个数 假设x=2:y=3,我们的目标是(没有蛀牙!!)交换x,y的值: 利用异或的特殊性:x^x=0 即两个相同数字异或后值为0: 解决: 令x=x^y=2^3 令y=x^y=x^y^y=2^3^3=2(此时x=x^y) 令x=x^y=x^y^2=2^3^2=3(此时x=x^y:y=2) 问题2:实现pow(int x, int y) ,即x的y次方 x的y次方就是有y个x连续乘机,代码如下: #include <stdio.h> #include <stdlib.h&

异或交换两个数的陷阱【转】

前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量. 如下面: void exchange(int &a, int &b) { a ^= b; b ^= a; a ^= b; } 然而,这里面却存在着一个非常隐蔽的陷阱. 通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]), 这儿如果i==j了(这种情况是很可能发生的),得到的结果就并非我们所期望的. void main() { int a[2] = {1, 

不使用中间变量交换两数

public static void swap1(Num num){ num.a = num.a + num.b;    num.b = num.a - num.b;    num.a = num.a - num.b;} 使用异或运算符:我们知道,任何数与0异或后仍然为它本身,两个相同的数异或后为0. static class Num{    int a;    int b;} public static void swap2(Num num){    num.a = num.a ^ num.b

(转)Java 交换两数的方法

错误示范 1. 直接交换 1 public class SwapNumbers { 2 3 // 直接交换 4 public static void swap(int a, int b) { 5 int temp = a; 6 a = b; 7 b = temp; 8 }; 9 10 public static void main(String[] args) { 11 int a = 10; 12 int b = 20; 13 System.out.println("交换前: a = &quo

不增加额外变量交换两数

//普通操作 void swap(int &a, int &b) { a = a + b; b = a - b; a = a - b; } //位与操作 void swap(int &a, int &b) { a ^= b; b ^= a; a ^= b; } 作者:力扣(LeetCode)链接:https://www.zhihu.com/question/38206659/answer/736472332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请

通过异或位交换两个整型变量的一个不容易注意的细节

设变量 a = 1, b = 2, 我们要交换两个变量的值, 当用异或交换两个值的时候会有一个小问题 用位运算大概是这个样子的 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 void swap(int& a, int &b) { 6 a ^= b; 7 b ^= a; 8 a ^= b; 9 } 10 11 int main() { 12 int a = 2, b = 3; 13 cout << &qu

异或交换数值的分析

异或(^) 跟 按位与(&).按位或(|) 一样是一个位运算符,运算速度自然是很快的. 一般的,它似乎没什么用途.我所知道的它最多就用来加加密,用来交换数值.这里说说使用异或交换数值的一些利弊. 优点: 不需要使用中间变量 一般的交换a,b的值,是使用第三方变量temp temp = a; a = b; b = temp; 可是有一天突然发现了有异或交换数值的方法,这个方法不需要使用第三方变量 a = a ^ b; b = a ^ b; a = a ^ b;  这个方法的写法也很简单:复制3行a

交换两个数值的方法,注意有【坑】,闲来无事,总结一下

交换两个数值的方法 题面: 设a,b两个整数值,交换两个a,b二者的值, 例如: 设 a=1, b=2, 交换后 a=2,b=1 这几种方法,网上也说过很多,但是都没注意这几种方法的[坑],不要只顾着新奇方法,毕竟[可靠性]很重要,这里稍微记录下 方法1 最简单的方法就是加一个中间量: int c=a; a=b; b=c; 方法2 使用异或运算 xor: a = a xor b; //a=3, b=2 b = a xor b; //a=3, b=1 a = a xor b; //a=2, b=1

两个常见位操作面试题 不用加减乘除运算符计算两数之和及a b 3

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net <两个常见位操作面试题不用加减乘除运算符计算两数之和及a=b*3> 地址:http://blog.csdn.net/morewindows/article/details/8710737转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 上一篇<位操作基础篇之位操作全面总结>