《高效程序的奥秘》第二章读书笔记(三)

本文作者:riag
本文出处:http://blog.csdn.net/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个值之间的交换,这里就不写了,因为比较复杂

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值