• 神奇的位运算及其简单应用


    1. 变量交换

    首先说个好玩的——诡异的变量交换。
    交换两个int变量平时写程序会经常用到,当时,常规方法都要用三个变量,但是位运算里不需要第三个变量,仅仅需做三次异或运算:
    a ^= b;
    b ^= a;
    a ^= b;
    经过这样的三次异或运算后, a、b两个变量的值就交换过来了,原理?

    原因是异或运算的逆运算就是自己,也就是一个数对一个数异或运算两次就是其本身。
    2. 位运算实现int型快速乘法运算
    判断奇偶性(对2取余):
    a&1 == 0    偶数
    a&1 == 1    奇数
    计算2^n
    1 << n
    对2^n做乘法或除法:
    a << n  等价于  a * (2 ^ n)
    a >> n  等价于  a / (2 ^ n)
    看到这里,也许大家会很纳闷,好好的乘法除法为什么要写成位运算呢?
    其实,位运算的操作单元是bit,运算效率能提高60%。
    在平时写程序的过程中,适当应用这些运算,可以大大提高程序的运行速度,下面以经典的二分求幂做一个例子:
    int Power(int a, int n, int mod) // cal (a^n)%mod { int ans = 1; while (n > 0) { if (n & 1) { ans *= a; n--; } else { a *= a; n >>= 1; } ans %= mod; } return ans; } 
    3. 位运算的其他应用
    (1) 取int型变量a的第k位 (k=0,1,2……sizeof(int))
    a>>k&1
    (2) 将int型变量a的第k位清0
    a=a&~(1<<k)
    (3) 将int型变量a的第k位置1
    a=a|(1<<k)
    (4) int型变量循环左移k次
    a=a<<k|a>>16-k   (设sizeof(int)=16)
    (5) int型变量a循环右移k次
    a=a>>k|a<<16-k   (设sizeof(int)=16)
    (6) 实现最低n位为1,其余位为0的位串信息:
    ~(~0 << n)
    (7)截取变量x自p位开始的右边n位的信息:
    (x >> (1+p-n)) & ~(~0 << n)
    (8)截取old变量第row位,并将该位信息装配到变量new的第15-k位
    new |= ((old >> row) & 1) << (15 – k)
    (9)设s不等于全0,代码寻找最右边为1的位的序号j:
    for(j = 0; ((1 << j) & s) == 0; j++) ;
  • 相关阅读:
    学习java随笔第二篇:java开发工具——Eclipse
    GDB
    【转】图像分割(Image Segmentation)
    [转]C#Windows窗体打开图像与保存
    【转】opencv 分水岭算法cvWatershed
    C#中Rectangle(Point, Size) 和Rectangle(Int32, Int32, Int32, Int32) 区别
    【转】数组和图像的转换
    .Net的垃圾回收机制(GC)之拙见——托管类型的垃圾回收
    【动态规划】滚动数组的求解(C++)
    C#编程语言之委托与事件(二)—— C#事件
  • 原文地址:https://www.cnblogs.com/smallgo/p/3120685.html
Copyright © 2020-2023  润新知