引用: 原帖由 David_Lee 于 2011-4-11 22:25 发表 没记错的话,有异或法、加减法、乘除法,三个版本。
#define swap((x),(y)); { (x) = (x) ^ (y); (y) = (x) ^ (y); (x) = (x) ^ (y); }
引用: 原帖由 David_Lee 于 2011-4-11 22:25 发表 没记错的话,有异或法、加减法、乘除法,三个版本。
#define swap((x),(y)); { (x) = (x) + (y); (y) = (x) - (y); (x) = (x) - (y); }
引用: 原帖由 David_Lee 于 2011-4-11 22:25 发表 没记错的话,有异或法、加减法、乘除法,三个版本。
#define swap((x),(y)); { (x) = (x) * (y); (y) = (x) / (y); (x) = (x) / (y); }
引用: 原帖由 jxb01033016 于 2011-4-12 15:15 发表 假如a和b为无字符变量,那么a+b必须小于等于255才可以,否则溢出,可见,加减法未必就好.
若果a和b为无符号字节变量,a+b>255也是可以的。
溢出后保留的是后面8位,减的时候不够减,编译器会自动借位。
引用: 原帖由 wanghongyang 于 2011-4-12 12:07 发表 加减法是最好的版本!~
异或法效率不会低于加减法,没记错的话,异或指令跟加减法一般都是单周期的。
异或法是直接按位置换,比加减法要直观。
引用: 原帖由 David_Lee 于 2011-4-11 22:25 发表 没记错的话,有异或法、加减法、乘除法,三个版本。
4/5/6楼是不是编译会报错啊?在实习,没有编译器,只有AutoCAD。
是不是应该写成:
#define swap1(x,y); {(x)=(x)^(y);(y)=(x)^(y);(x)=(x)^(y);}
#define swap2(x,y); {(x)=(x)+(y);(y)=(x)-(y);(x)=(x)-(y);}
#define swap3(x,y); {(x)=(x)*(y);(y)=(x)/(y);(x)=(x)/(y);}