zoukankan      html  css  js  c++  java
  • 神奇的位运算及其简单应用

    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++) ;
  • 相关阅读:
    Hdu 1257 最少拦截系统
    Hdu 1404 Digital Deletions
    Hdu 1079 Calendar Game
    Hdu 1158 Employment Planning(DP)
    Hdu 1116 Play on Words
    Hdu 1258 Sum It Up
    Hdu 1175 连连看(DFS)
    Hdu 3635 Dragon Balls (并查集)
    Hdu 1829 A Bug's Life
    Hdu 1181 变形课
  • 原文地址:https://www.cnblogs.com/smallgo/p/3120685.html
Copyright © 2011-2022 走看看