不要采用异或来交换两个变量

来源:本站
导读:目前正在解读《不要采用异或来交换两个变量》的相关信息,《不要采用异或来交换两个变量》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《不要采用异或来交换两个变量》的详细说明。
简介:不要采用异或来交换两个变量。

在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式:

方式一

{  x = x ^ y;  y = x ^ y;  x = x ^ y;}

而不是采用临时变量实现交换:

方式二

{  int temp;  temp = a;       a = b;  b = temp;}

美其名曰:节省内存,提高运行速度。

但是,真的节省了内存吗?

使用这种方式大部分时候,没有节省内存。因为,一般情况下编译器会将方式二中的临时变量优化到寄存器中,不使用堆栈。

真的提高了运行速度吗?

由于方式一,每一次执行都会多进行三次异或运算。又由于方式一的代码,在编译器理解起来,可能比较困难所以编译器翻译出来的代码,执行效率更低。

关于优化:

“过早的优化是万恶之源”,当我们没有确定程序影响性能最重要的20%代码时,最好不要进行优化。同时,在优化时,不要过于相信经验,因为CPU技术,编译技术,操作系统等等,都会让看似可行的技术,失效。

在优化前,通过实际的运行确定影响性能的代码,然后进行优化。

最后,从软件工程的角度看,代码是写给人看的。最容易理解的代码,被维护的代价也最小,方式二的代码更容易阅读。

编译器很强大,CPU技术进步很快,我们的经验积累反而是最慢的,有些来不及积累,就已过时。多反思,多总结。

附注:

将一个字节进行首尾位倒序,可以考虑一下采用位运算的方式解决。

例:

uint8_t SwapBitsInByte(uint8_t input){  uint8_t output = 0;  uint8_t i;  for (i = 0; i < 8; i++) {    if (input & (1 << i)) {      output |= 1 << (7 - i);    }  }  return output;}位交换:uint8_t SwapBitsInByte(uint8_t val){  val = (val & 0x55) << 1 | (val & 0xAA) >> 1;  val = (val & 0x33) << 2 | (val & 0xCC) >> 2;  val = (val & 0x0F) << 4 | (val & 0xF0) >> 4;  return val;}

提醒:《不要采用异或来交换两个变量》最后刷新时间 2024-03-14 01:01:47,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《不要采用异或来交换两个变量》该内容的真实性请自行鉴别。