本文作者:riag
本文出处:http://blog.youkuaiyun.com/riag
声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明信息. 谢谢.
循环移位
- 左循环移位n个位:
y = (x<<n) | (x>>(32-n))
- 右循环移位n个位:
y = (x>>n) | (x<< (32-n) )
交换寄存器
其实就是前几年比较流行的不需要临时变量交换2个整数的面试题
方法一:
x = x^y;
y = x^y ;
x = x^y;
方法二:
x = x+y ;
y = x-y ;
x = x-y ;
这个方法会有溢出的问题
交换寄存器的相应字段
问题 : 对于两个寄存器x和y以及掩码m, 当第i位的掩码m i = 1时,交换x和y的第i位内容而当第i位的掩码m i = 0时,保留x和y的第i位的内容不变
方法一:
x1 = (x&(~m)) | (y&m) ; // x1是临时变量
y = (y&(~m)) | (x&m) ;
x = x1
方法二:
x = x^y ;
y = y^(x&m) ;
x = x^y ;
两个或更多值之间的交换
假设一个变量x只能是两个值a和b,希望给x赋值为与它当前值不同的值。c语言代码:
if(x == a) x =b ;
else x=a ;
或者是::
x = (x==a)? b:a
有一个更好的方法 :
x = a+b-x ;
//或者
x = a^b^x ;
书中还介绍了3个值之间的交换,这里就不写了,因为比较复杂