位运算应用

来源:互联网 发布:mysql in查询效率 编辑:程序博客网 时间:2024/05/16 05:54

 1.移位运算避免乘法

使用移位运算来避免乘法运算是一种常用技巧,不过乘数必须都是正整数,而且必须至少有一个是 2 n 次方,例如:2481632……移位运算的特点是速度快,而乘法运算速度较慢,把乘法运算转化为移位运算可以稍微提高程序运行效率。例如:

        num *= 32;
       
等同于
        num <<= 5; /* 2
5 次方等于 32 */

如果乘数不是 2 n 次方,我们可以把乘数分解成几个 2 n 次方的和:
        num *= 20;
       
等于
        num *= (16 + 4);
       
等于
        num = num * 16 + num * 4;
       
等于
        num = (num << 4) + (num << 2);

不过,现在的编译器很聪明,它们会代替我们做这种优化。也就是说,如果我们写的语句是:
        num *= 100;
编译器会把这个语句优化为:
        num = (num << 6) + (num << 5) + (num << 2);

所以,我们没有必要手工进行这种优化,因为编译器会替我们完成。而且,就算进行了这种优化,速度也不会有太大提高。我们应该把精力用来改进算法,一个好的算法可以让程序运行效率大大提高!

 2.位运算的一些应用

  移位运算与位运算结合能实现许多与位串运算有关的复杂计算。设变量的位自右至左顺序编号,自0位至15位,有关指定位的表达式是不超过15的正整数。以下各代码分别有它们右边注释所示的意义:
   (1)
判断int型变量a是奇数还是偶数,尤其是对大数的判断
        a&1 == 0
偶数
        a&1 == 1
奇数
    (2)
int型变量a的第k (k=0,1,2……sizeof(int))
 a>>k&1
    (3)
int型变量a的第k位清0
 a=a&~(1<<k)
    (4)
int型变量a的第k位置1
 a=a|(1<<k)
    (5) int
型变量循环左移k
 a=a<<k|a>>16-k   (
sizeof(int)=16)
    (6) int
型变量a循环右移k
 a=a>>k|a<<16-k   (
sizeof(int)=16)
    (7)
实现最低n位为1,其余位为0的位串信息:
 ~
~0 << n
    (8)
截取变量xp位开始的右边n位的信息:
 (x >> (1+p-n)) & ~(~0 << n) 
    (9)
截取old变量第row位,并将该位信息装配到变量new的第15-k
 new |= ((old >> row) & 1) << (15 – k)
    (10)
s不等于全0,代码寻找最右边为1的位的序号j:
 for(j = 0; ((1 << j) & s) == 0; j++) ;

 
原创粉丝点击