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; 
        }

最新文章

  1. UML九种图作用简介
  2. 一行实现QQ群组头像,微信群组,圆角等效果. 并支持url直接加载图片
  3. fnc.tld学习编写
  4. Sublime Text 2 快捷键 (windows)
  5. 编程语言java-并发(锁)
  6. Silver Cow Party(最短路,好题)
  7. Spring之AOP
  8. JavaScript由单价、数量计算总价
  9. Spring Framework 5.0.0.M3中文文档 翻译记录 Part I. Spring框架概览1-2.2
  10. MTD应用学习:mtd和mtdblock的区别
  11. 茴香豆的第五种写法---设置ExpandableListView系统自带图标按下效果
  12. Centos 6安装完美搭建mysql、php、apache之旅
  13. 通过 pxe(网络安装)完成centos 系统的网络安装
  14. 洛谷 [P2590] 树的统计
  15. ORA-12557协议适配器不可加载
  16. 第一册:lesson thirty one。
  17. python 语言特性
  18. Linux及Arm-Linux程序开发笔记(零基础入门篇)
  19. 学习使用NotePad++
  20. C语言 · 集合运算

热门文章

  1. 【4】创建一个自己的Bootstrap模板
  2. 对于python WSGI的理解
  3. Linux中的文件上传下载
  4. CoreGraphics之CGContext绘图
  5. BZOJ 2124等差子序列 线段树&&hash
  6. 视图--bai
  7. Hibernate与数据库分表
  8. Python中异常(Exception)的总结
  9. Centos 6.4上面用Shell脚本一键安装mysql 5.6.15
  10. POJ 1364 King