zoukankan      html  css  js  c++  java
  • 【数学】位运算

    尽量只对无符号数使用移位运算

    右移:丢弃最低位,向下取整,(-1>>1的结果是-1)
    左移:有符号数

    位运算的优先级,除了取反符高于算术运算符,其他符号都低于算术运算符。
    其中& | ^的优先级甚至低于比较运算符。

    判断是否是二的非负整数次幂:

    bool isPowerOfTwo(int n) { return n > 0 && (n & (n - 1)) == 0; }
    

    取某一位

    // 获取 a 的第 b 位,最低位编号为 0
    int getBit(int a, int b) { return (a >> b) & 1; }
    

    置为0

    // 将 a 的第 b 位设置为 0 ,最低位编号为 0
    int unsetBit(int a, int b) { return a & ~(1 << b); }
    

    置为1

    // 将 a 的第 b 位设置为 1 ,最低位编号为 0
    int setBit(int a, int b) { return a | (1 << b); }
    

    差集:

    a&(~b) 
    集合A减去集合B中存在的元素
    

    枚举一个集合的非空子集:单次O(2^popcount(s)) 总共(O(3^n))

    for(int S = 1; S < (1 << n); ++S) {
        for (int s = S; s; s = (s - 1)&S) {
    
        }
    }
    

    小心全0的情况:使用longlong要加ll

    int __builtin_clz(unsigned int x) //前导零
    int __builtin_ctz(unsigned int x) //末尾零
    int __builtin_popcount(unsigned int x) //1的个数
    
    31-__builtin_clz(n) // 以2为底的对数
    
  • 相关阅读:
    codeforces 980A Links and Pearls
    zoj 3640 Help Me Escape
    sgu 495 Kids and Prizes
    poj 3071 Football
    hdu 3853 LOOPS
    hdu 4035 Maze
    hdu 4405 Aeroplane chess
    poj 2096 Collecting Bugs
    scu 4444 Travel
    zoj 3870 Team Formation
  • 原文地址:https://www.cnblogs.com/purinliang/p/14265188.html
Copyright © 2011-2022 走看看