402v /posts/yi-wei-yun-suan-fu

移位运算符

移位运算先转化成2进制,再根据运算符指定的位数作以为运算。 左移运算符(<<):逻辑/

<!--more-->

算数移位。在不考虑溢出的情况下,相当于乘2,移位时移出的位数全部丢弃,右侧补入的数全部是0;左移时要注意有符号数的溢出情况。 右移运算符(>>):算术运算,对于无符号数以及有符号正数相当于除2,移位时溢出的位数全部丢弃,补入的数分为两种情况:如果是无符号数,左侧全部补0;如果是有符号数与符号位和编译器有关,一般情况下补符号位的副本。


移位计数的取值问题:

  1. 网上查到的结果是如果移动的位数超过类型的长度时,会对移位计数取余,举个小例子:

    int i = 1, j = 0x80000000; //设int为32位 i = i << 33; // 33 % 32 = 1 左移1位,i变成2 j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

  2. 《C Traps and Pitfalls》这本书上说的是:移位计数必须大于等于0,而严格小于n(如上例的32位),即:i << 32 和 i<<-1这种写法都是非法的,我猜是这本书出版的时间比较早,但是我还是更喜欢这样的做法。

除法运算代替以为运算,将导致程序运行速度大大减慢。换句话说:使用移位预算符将大大提高程序的执行效率。对于这一点我将在自己以后的应用中继续总结。

评论 · 0

还没有评论。