哎,冲动是魔鬼。本以为是什么发现呢,其实是很简单的道理,只不过我们不去思考吧了。今天无聊时,想起他们的运算效率问题。从而发现实现两着交换用乘法,减法也可以的。哎,开始发现时是那么激动仔细一想其实很普通的,为自己下。不说这个了。
看看他们的效率如何。
#include <windows.h>
#include <iostream>
#pragma comment(lib,"Kernel32.lib")
int main()
{
int a = 3,b = 6,c = 0;
DWORD start = 0,end = 0;
start = GetTickCount();
a = a + b;
b = a - b;
a = a - b;
end = GetTickCount();
c = end - start;
std::cout<<"c is: "<<c<<std::endl;
std::cout<<"a is: "<<a<<std::endl;
std::cout<<"b is: "<<b<<std::endl;
std::cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<std::endl;
start = GetTickCount();
a = a * b;
b = a / b;
a = a / b;
end = GetTickCount();
c = end - start;
std::cout<<"c is: "<<c<<std::endl;
std::cout<<"a is: "<<a<<std::endl;
std::cout<<"b is: "<<b<<std::endl;
std::cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<std::endl;
start = GetTickCount();
a = a ^ b;
b = a ^ b;
a = a ^ b;
end = GetTickCount();
c = end - start;
std::cout<<"c is: "<<c<<std::endl;
std::cout<<"a is: "<<a<<std::endl;
std::cout<<"b is: "<<b<<std::endl;
system("pause");
return 0;
}
代码是这样的。输出的结果是:
c is: 0
a is: 6
b is: 3
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c is: 0
a is: 3
b is: 6
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
c is: 0
a is: 6
b is: 3
效率一样。呵呵。
你们受骗了,其实效率是不一样的。当他们翻译成汇编后你就回发现 ^ 运算最复杂,但是那是小于微秒级的运算,所以系统被忽略掉了,所以我们看到结果总是0。GetTickCount获取至今的微秒数。