ACM位运算技巧

位运算应用口位运算应用口诀位运算应用口诀 
清零取反要用与,某位置一可用或 
若要取反和交换,轻轻松松用异或 
移位运算 
要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。 
    2 " >"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。 
    4 ">>>"运算符,右边的位被挤掉,对于左边移出的空位一概补上0。 
位运算符的应用 (源操作数s 掩码mask) 
(1) 按位与-- & 
1 清零特定位 (mask中特定位置0,其它位为1,s=s&mask) 
2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask) 
(2) 按位或-- ¦ 
    常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s ¦mask) 
(3) 位异或-- ^ 
1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask) 
2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1) 
    目 标          操 作              操作后状态 
a=a1^b1        a=a^b              a=a1^b1,b=b1 
b=a1^b1^b1      b=a^b    
         a=a1^b1,b=a1 
a=b1^a1^a1      a=a^b              a=b1,b=a1 
二进制补码运算公式: 
-x = ~x + 1 = ~(x-1) 
~x = -x-1 
-(~x) = x+1 
~(-x) = x-1 
x+y = x - ~y - 1 = (x ¦y)+(x&y) 
x-y = x + ~y + 1 = (x ¦~y)-(~x&y) 
x^y = (x ¦y)-(x&y) 
x ¦y = (x&~y)+y 
x&y = (~x ¦y)-~x 
x==y:    ~(x-y ¦y-x) 
x!=y:    x-y ¦y-x 
x >k&1 
(3) 将int型变量a的第k位清0,即a=a&~(1 >16-k  (设sizeof(int)=16) 
(6) int型变量a循环右移k次,即a=a>>k ¦a >1); 

(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂 
boolean power2(int x) 

    return ((x&(x-1))==0)&&(x!=0); 

(9)不用temp交换两个整数 
void swap(int x , int y) 

    x ^= y; 
    y ^= x; 
    x ^= y; 

(10)计算绝对值 
int abs( int x ) 

int y ; 
y = x >> 31 ; 
return (x^y)-y ;        //or: (x+y)^y 

(11)取模运算转化成位运算 (在不产生溢出的情况下) 
        a % (2^n) 等价于 a & (2^n - 1) 
(12)乘法运算转化成位运算 (在不产生溢出的情况下) 
        a * (2^n) 等价于 a > n 
        例: 12/8 == 12>>3 
(14) a % 2 等价于 a & 1        
(15) if (x == a) x= b; 
            else x= a; 
        等价于 x= a ^ b ^ x; 
(16) x 的 相反数 表示为 (~x+1)

实例 
    功能              ¦          示例            ¦    位运算 
----------------------+---------------------------+-------------------- 
去掉最后一位          ¦ (101101->10110)          ¦ x >> 1 
在最后加一个0        ¦ (101101->1011010)        ¦ x 1011011)        ¦ x 101101)          ¦ x ¦ 1 
把最后一位变成0      ¦ (101101->101100)          ¦ x ¦ 1-1 
最后一位取反          ¦ (101101->101100)          ¦ x ^ 1 
把右数第k位变成1      ¦ (101001->101101,k=3)      ¦ x ¦ (1 101001,k=3)      ¦ x & ~ (1 101101,k=3)      ¦ x ^ (1 101)            ¦ x & 7 
取末k位              ¦ (1101101->1101,k=5)      ¦ x & ((1 
取右数第k位          ¦ (1101101->1,k=4)          ¦ x >> (k-1) & 1 
把末k位变成1          ¦ (101001->101111,k=4)      ¦ x ¦ (1 100110,k=4)      ¦ x ^ (1 100100000)    ¦ x & (x+1) 
把右起第一个0变成1    ¦ (100101111->100111111)    ¦ x ¦ (x+1) 
把右边连续的0变成1    ¦ (11011000->11011111)      ¦ x ¦ (x-1) 
取右边连续的1        ¦ (100101111->1111)        ¦ (x ^ (x+1)) >> 1 
去掉右起第一个1的左边 ¦ (100101000->1000)        ¦ x & (x ^ (x-1)) 
判断奇数      (x&1)==1 
判断偶数 (x&1)==0        
例如求从x位(高)到y位(低)间共有多少个1 
public static int FindChessNum(int x, int y, ushort k) 
        { 
            int re = 0; 
            for (int i = y; i > (i - 1)) & 1); 
            } 
            return re; 
        }

ACM位运算技巧的更多相关文章

  1. ACM中的位运算技巧

    听说位运算挺好玩的,那这节总结一下ACM中可能用到的位运算技巧. XOR运算极为重要!!(过[LC136](只出现一次的数字 - 力扣(LeetCode)):数组中每个数字都出现两次,只有一个出现一次 ...

  2. acm位运算应用 搜索

    acm位运算应用 搜索 搜索    此处不讲题目,只讲位运算是怎样在这些题中实现和应用的.由于搜索题往往是基于对状态的操作,位运算往往特别有效,优化之后的效果可以有目共睹.    例1.POJ 132 ...

  3. 关于C/C++中的位运算技巧

    本篇文章讲述在学习CSAPP位运算LAB时的一些心得. 移位运算的小技巧 C/C++对于移位运算具有不同的策略,对于无符号数,左右移位为逻辑移位,也就是直接移位:对于有符号数,采用算术移位的方式,即左 ...

  4. 你必须知道的基本位运算技巧(状压DP、搜索优化都会用到)

    一. 位操作基础 基本的位操作符有与.或.异或.取反.左移.右移这6种,它们的运算规则如下所示: 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两个位都为0时,结果才为0 ...

  5. 趣题: 按二进制中1的个数枚举1~2^n (位运算技巧)

    ; ; k <= n; k++){ << k)-,u = << n; s < u;){ ;i < n;i++) printf(-i)&); print ...

  6. ACM 位运算

    的幂 boolean power2(int x) { return((x&(x-1))==0)&&(x!=0): } For example: #include<stdi ...

  7. 常见的位运算技巧总结(膜wys)

    看了wys的论文,感觉获得了不少新姿势 这里总结一下 #include <iostream> using namespace std; typedef unsigned int u32; ...

  8. [ C++ ] 常用位运算技巧

    1.除以二 a >> 1 2.二的n次方 1 << n 3.十进制转2进制 x&(1<<i) 持续更新

  9. C语言的位运算

    位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2;x = x * 64;//改为:x = x << 1; // 2 ...

随机推荐

  1. A-frame_02

    A-Frame 让我们能够仅仅通过几行HTML代码创建出可以运行在桌面, 虚拟眼镜, 以及手机上的VR场景. 而且因为这个框架是基于HTML的, 我们也可以像一般的HTML元素一样配合JavaScri ...

  2. PHPCMS二次开发教程(转)

    转自:http://www.cnblogs.com/semcoding/p/3347600.html PHPCMS V9 结构设计 根目录 |–api  结构文件目录 |–caches 缓存文件目录 ...

  3. PHP开发圣经读书笔记01

    从今天开始,以“圣经”这本书为教材,系统的温习一下php,之前都是看视频学的. 1.访问表单变量--php变量名称必须与表单域的名称一致 例:$_POST['uname'];  //表示把表单域中na ...

  4. 如何读懂Oracle文档中的语法图(转)

    本文转载自:http://kyle.xlau.org/posts/syntax-diagrams.html Oracle文档中用到了两种表达语法的方法,语法图和BNF. BNF, Backus-Nau ...

  5. Python Socket,How to Create Socket Cilent? - 网络编程实例

    文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...

  6. poj 1904 King's Quest

    King's Quest 题意:有N个王子和N个妹子;(1 <= N <= 2000)第i个王子喜欢Ki个妹子:(详见sample)题给一个完美匹配,即每一个王子和喜欢的一个妹子结婚:问每 ...

  7. 关于javac编译时出现“非法字符:\65279”的解决方法

    一般用UE或记事本编辑过的UTF-8的文件头会加入BOM标识,该标识由3个char组成.在UTF-8的标准里该BOM标识是可有可无的,Sun 的javac 在编译带有BOM的UTF-8的格式的文件时会 ...

  8. PHP完整环境搭建

    Linux(CentOS 7)+ Nginx(1.10.2)+ Mysql(5.7.16)+ PHP(7.0.12) 首先安装Linux系统,我以虚拟机安装来做示例,先去下载 VitualBox,这是 ...

  9. Event Aggregator

    /** * Created with JetBrains WebStorm. * User: 宇乔 * Date: 13-8-2 * Time: 下午3:01 * To change this tem ...

  10. Memcached(七)Memcached的并发实例

    1. Memcached是什么?Memcached是分布式的内存对象缓存系统.  2. Memcached的基本数据结构是什么?Memcached是基于Key/Value对的HashMap.每一对,都 ...