我为什么不喜欢用异或做两数值的交换

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

大家在初学编程的过程中,肯定会学习到使用代码去交换两元素的值

虽然已经过去了很久,但笔者对当时老师上课所讲的话记忆犹新:

“交换两个值,就像是把醋瓶子里的酒装入酒罐,把酒罐子里的醋倒入醋瓶。

要完成此任务,就要多找一个空瓶子,作为两者的交换的暂存罐”

同理,代入代码中,我们可以多定义一个变量,作为数值的“暂存罐”

int a = 5;
int b = 3;
int tmp;

tmp = a;
a = b;
b = tmp;

浅显易懂,且十分符合我们作为初学者的正常思维逻辑


慢慢地,学到后来,笔者发现不少书籍以异或交换两元素值为荣

(让读者不能直接看懂代码的内容以彰显本书的高大上), ps: 这只是笔者的主观想法。

而我们,也是无脑的跟着学,而十分简单的交换运算自此也变得花里胡哨起来:

a = a + b;
b = a - b;
a = a - b;
a = a ^ b;
b = a ^ b;
a = a ^ b;

......

在我当初的心中,假若别人第一眼无法看懂自己的代码,那么就可以凸显自己代码的高深莫测

仅仅在交换两值上,就下了不少的功夫

我懂你们不懂的,我能写出你们看不懂的

美其名曰为了面试拓展自己的代码风格,殊不知一大半都是自己的优越感与装逼的欲望在作祟


举个简单的例子:

    对于吃饭,有的人用勺子吃,有的人用筷子吃,这本再正常不过。然后突然冒出来一个二逼,

用一支筷子,以一种离奇且不可描述的方式,也吃到了饭:你们这群low逼,看我用一支筷子就吃

到饭了,还节约使用了一支筷子......然后,原本正常吃饭的人也统统学习这个吃饭方式,生怕自己被落下


在此笔者不禁问一句:有意思吗? 或者说,有意义吗?

有没有意思这个取决于个人,但意义,真的不大


使用勺子,使用一双筷子,别人看到自然会想到这个人在吃饭

而倘若你用一支筷子,别人只会认为你瞎闹着玩,更不会明白原来你在吃饭

代入编程中,这是代码的清晰度与否的问题


况且,用异或来交换两元素的值,也未必就比使用暂存变量交换更快

我们总是理所当然得认为位运算会快一些,所以只要是有关位运算,我们总认为其效率高

更何况是交换两值如此简单的运算......

话不多说,直接上图。为了具有一般性,笔者给运算加上了循环(代替了多次运行程序以求平均值),

这是笔者用自己的电脑多次运行程序之后,对结果取的适中的值:

  这是异或运算:


所以,无论是以代码的清晰度来书,还是程序运行的效率,我们都有理由选择要一个“暂存罐”


使用异或交换两元素值是众多“用一支筷子的吃饭”的一例。希望大家在阅读我的文之后,在面对着

那些炫耀着以一只筷子吃饭的时候,能保持一个客观清醒的态度并坚持使用自己的勺子(一对儿筷子),

毕竟,这都什么年代了,又不是缺那一支筷子.......

(当然,假若你实在穷的没有多余的筷子了,不如将异或运算改为加减运算吧,因为如果两数值相同的话,异或结果是为0的。我们再顺带把暂存罐也扔了)

a = a + b;
b = a - b;
a = a - b;

要采用异或交换两个变量 要采用异或交换两个变量 立即下载

相关推荐

异或交换两个变量是错误的

异或交换变量是错误的 陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice 翻转一个字符串,例如把 "12345" 变成 "54321",这是一个最简单的过的编码任务,即便是 C 语言初学者的也能毫费力地写出类似如下的代码: // 版本一,用中间变量交换两个数,好代码void reverse_by_swap(char*

陈硕的Blog 4万+

利用异或交换数组元素

一般的排序算法中的用于交换数组里面两个位置元素的swap函数都要使用一个temp变量作为中转,但是利用异或,可以实现无需中转变量即可完成元素的交换,其中的原理基于以下: 假设两个数a和b,将a异或b的值记temp,即: temp=a^b; 那么temp^a的值为b,并且temp^b的值为a。 也就是说:将异或的结果与其中一数再进行异或,可以得到另一个数。 根据这个定理,我们可以将temp的值直接保存在其中一个数组元素里面,从而实现借助中转变量的数组元素交换。 public class

CAFE-BABE的博客 1266

使用异或交换数据的优缺点

使用异或交换数据只有缺点,没有优点! 家人们,我在刚开始学习到可以使用异或交换数据的时候,我就潜意识的以为(或者是受身边影响)以为这个方法是最高效最好的,但是后来我就想到运算难道比赋值还快吗,结果恰恰相反,使用异或最多就是用设置第三个变量,然而它却缺点重重; 交换数据常见的三种方法 第一种,创建第三个变量交换数据,最原始的方法 int a;int b; int tem = a; a = b; b = tem; 第二种,创建第三个变量交换数据,但是可能会导致数据溢出,使程序崩溃

bacon_zhong的博客 1125

异或运算(交换两个值)

这也是选择排序算法博客中为什么提醒大家在交换值时要判断nums的i下标与mins下标是否相同。eg: 用十六进制表示:0xA1 ^ 0x06= 0xA7。

拒绝摆烂的博客 1012

异或运算实现数组中两个数字交换

异或运算实现数组中两个数字交换 之前对异或运算太熟悉,今天刷LeetCode的时候遇到了一题: 正常我们交换两个变量是: int a,b,c; c = a; a = b; b = c; 一时没想到用临时变量怎么,后来想到了异或运算,异或运算的性质有: 1.任意一个变量X与其自身进行异或运算,结果为0,即X ^ X=0 2.任意一个变量X与0进行异或运算,结果变,即X ^ 0=X 3.异或运算具有可结合性,即a ^ b ^ c= (a ^ b) ^ c = a ^ (b ^ c) 4.异或运算具有

Tropicana_y的博客 570

异或交换两个

异或交换两个数 a和b是两个整数,经过以下三次异或操作,可以达到交换目的: a = a ^ b; b = a ^ b; a = a ^ b; 首先要理解,什么是^(异或)操作 二进制数运算结果:   0 ^ 0 = 0   0 ^ 1 = 1   1 ^ 0 = 1   1 ^ 1 = 0 相同为0,同为1 假设: a = 10 , 其二进制数为: 1010 b = 12 , 其二进制...

Mr.魏 6287

为什么三次异或可以交换两个数?一文教你明白【异或】操作

异或,英文为exclusive OR,缩写成xor,用符号⊕表示 百度百科有具体介绍:异或_百度百科 如果a、b两个相同,则异或结果为1。如果a、b两个值相同,异或结果为0。这个运算属于二进制中的运算规则。 最重要的一点是可以把异或操作认为是带进位的二进制加法。 例如: 0 0 1 0 1 1 0 0 ^ 0 1 0 0 0 1 1 1 = 0 1 1 0 1 0 1 1 ...

Harrison 4270

异或运算交换两个

a = a^b; b = a^b; a = a^b; 这样就可以借助第三个变量实现两个数的交换。基于如下几个性质: 任意变量x与自身异或结果为0,即:x^x = 0 任意变量x与0进行异或运算,结果变,即:x^0 = x 异或运算的结合性:a^b^c = (a^b)^c = a^(b^c) 异或运算的交换性:a^b = b^a 再来解释上面的交换为什么可行:a = a^b b = a^b --

Bing's Blog 7861

异或运算交换两个数的数值

交换变量有很多种方法,而异或运算就是其中一种。相较于其他方法,这种方法用使用中间变量。下面我们看一下这种算法: 首先我们先介绍一下异或运算,异或运算是一种逻辑运算,数学符号是⊕,相当于or。 异或运算是一种二进制运算: 0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0 者相等为0,等为...

moodfriend的博客 812

为什么异或操作可以交换两个数?

问题1:使用Java实现交换 方法一:使用第三个变量进行交换 int x = 10, y=12; System.out.println(“交换前:” + x + “,“ + y); int temp = x; x = y; y = temp; System.out.println(“交换后 :” + x + “,“ + y); 方法二:使用第三个变量,通过数学方式(数相加保存和)交换 int x = 10, y = 12; System.out.println(“交换前:” + x + “,“ +

weixin_44741610的博客 1255

为什么三次异或操作可以交换两个

a和b是两个整数,经过以下三次异或操作,可以达到交换目的:a = a ^ b;b = a ^ b;a = a ^ b; 首先要理解,什么是^(异或)操作:  二进制数运算结果:  0 ^ 0 = 0  0 ^ 1 = 1  1 ^ 0 = 1  1 ^ 1 = 0相同为0,同为1 假设:a = 10 , 其二进制数为: 1010b = 12 , 其二进制数为: 1100如果a和b...

weixin_30548917的博客 1298

C语言为什么能够通过异或交换

为什么经过几次异或之后两个数的数值可以发生交换呢?

张张的博客 875

关于数值交换

交换两个数值的多种方法

2402_88950569的博客 1771

异或运算实现交换

本文介绍了使用异或运算实现两个数的交换的方法

weixin_43433801的博客 3777

交换两个变量数值的3种方法

交换两个数值是"a = b,b = a"。这样的话,a先等于了b的值;当“b = a”后,因为此时a已经等于b的值了,这个语句就相当于执行了b = b。最终的数值关系就成了a == b,b == b。下面教给大家3种交换变量数值的方法:

2301_80030290的博客 2786

实现两个数的交换异或,加减)

1、 通常我们通过设置临时变量来实现两个数的交换,如下: void swap(int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } 2、还可以通过异或来实现两个同整数的交换,如下: void swap(int &a,int &b) { temp=a^b; //

wangyang20170901的博客 4586

通过异或交换两个数的值

通过异或交换两个数的值 异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为: a⊕b = (¬a ∧ b) ∨ (a ∧¬b) 如果a、b两个相同,则...

chudianmao8309的博客 313
上一篇: 各种排序算法的实现(快速排序)
下一篇: 使用IDEA创建maven项目却没有src目录的问题
DaysOfApril
博客等级 码龄8年 12粉丝 4原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值