移位运算 
要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。 
    2 " < <" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。 
    3 ">>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补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 < y:    (x-y)^((x^y)&((x-y)^x)) 
x <=y:    (x|~y)&((x^y)|~(y-x)) 
x < y:    (~x&y)|((~x|y)&(x-y))//无符号x,y比较 
x <=y:    (~x|y)&((x^y)|~(y-x))//无符号x,y比较 

应用举例 
(1) 判断int型变量a是奇数还是偶数            
a&1  = 0 偶数 
      a&1 =  1 奇数 
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1 
(3) 将int型变量a的第k位清0,即a=a&~(1 < <k) 
(4) 将int型变量a的第k位置1, 即a=a|(1 < <k) 
(5) int型变量循环左移k次,即a=a < <k|a>>16-k  (设sizeof(int)=16) 
(6) int型变量a循环右移k次,即a=a>>k|a < <16-k  (设sizeof(int)=16) 
(7)整数的平均值 
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法: 
int average(int x, int y)  //返回X,Y 的平均值 
{    
    return (x&y)+((x^y)>>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 
(13)除法运算转化成位运算 (在不产生溢出的情况下) 
        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) 

(17)求x转化为二进制之后包含1的数量

    int count = 0;

    while(x)

  {

    count++;

    x = x & (x - 1);

    }

最后得到的count 即为x转化为二进制之后包含1的数量

实例 

 

 

 

 

 

功能   

示例

位运算

去掉最后一位

(101101->10110)  

x >> 1  

在最后加一个0

(101101->1011010)  

x < < 1  

在最后加一个1

(101101->1011011) 

x < < 1+1  

把最后一位变成1

(101100->101101)  

x | 1  

把最后一位变成0

(101101->101100) 

x | 1-1  

最后一位取反

(101101->101100)  

x ^ 1  

把右数第k位变成1

(101001->101101,k=3)

x | (1 < < (k-1))  

把右数第k位变成0

(101101->101001,k=3)   

x & ~ (1 < < (k-1))  

右数第k位取反

(101001->101101,k=3)  

x ^ (1 < < (k-1))  

取末三位  

(1101101->101)  

x & 7  

取末k位

(1101101->1101,k=5) 

x & ((1 < < k)-1)  

取右数第k位

(1101101->1,k=4) 

x >> (k-1) & 1 

把末k位变成1

(101001->101111,k=4)  

x | (1 < < k-1)  

末k位取反

(101001->100110,k=4) 

x ^ (1 < < k-1)  

把右边连续的1变成0

(100101111->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 

C++位运算的更多相关文章

  1. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  2. 简简单单学会C#位运算

    一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...

  3. SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解

    本文目录列表: 1.位运算 2.设置日历数据表节假日标志 3.总结语 4.参考清单列表   位运算   SQL Server支持的按位运算符有三个,分别为:按位与(&).按位或(|).按位异或 ...

  4. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

  5. Java中的位运算

    昨天去面试的时候做到了一道Java的位运算题目,发现有个运算符不懂:">>>",今天特地查了一下,并小结一下常见的位运算符号: ~  按位非(NOT)(一元运算) ...

  6. C#位运算讲解与示例

    首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: p ...

  7. C#枚举中的位运算权限分配浅谈

    常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 & 0 = 0, 1 | 0 = 1, ~1 = 0 在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理. 第 ...

  8. Java位运算经典实例

    一 源码.反码.补码 正数的源码.反码.补码相同,例如5:            5的源码:101            5的反码:101            5的补码:101 负数的源码.反码.补 ...

  9. C入门---位运算

    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算直接对整数在内存中的二进制位进行操作.由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. (1),与(&)运算 ...

  10. EF架构~为分组添加位运算聚合方法

    回到目录 我们知道在Linq里的分组groupby可以对集合中一个或者多个字段进行分组,并对其中一个属性进行聚合,而Linq为我们提供了多种聚合方法,由aver,sum,count等,而在大叔权限体系 ...

随机推荐

  1. DB Query Analyzer 6.04 is distributed, 78 articles concerned have been published

        DB Query Analyzer 6.04 is distributed,78 articles concerned have been published  DB Query Analyz ...

  2. 图文浅析Binder机制

    总述: Binder是Android系统提供的一种IPC机制,Android系统基本就可以看做基于Binder的C/S架构,Binder也是C/S形式出现,它属于驱动但是驱动的一段内存而不是设备,框架 ...

  3. Java进阶(三十) 判断字符串编码类型

    java 判断字符串编码类型 public static String getEncoding(String str) { String encode = "GB2312"; tr ...

  4. Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)

    前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transfor ...

  5. OJ题:字符串最后一个单词的长度

    题目描述 计算字符串最后一个单词的长度,单词以空格隔开. 输入描述: 一行字符串,非空,长度小于5000. 输出描述: 整数N,最后一个单词的长度. 输入例子: hello world 输出例子: 5 ...

  6. java组播MulticastSocket

    在单播模式中有服务器端和客户端之分,而组播模式与单播模式不同,每个端都是以路由器或交换机做为中转广播站,任意一端向路由器或交换机发送消息,路由或交换机负责发送其他节点,每个节点都是同等的.所以在编程模 ...

  7. 分布式进阶(十二)Docker固定Container IP

    使用pipework工具. 前提:每个Container所做的工作现在还很少,可以不用save.commit. 为了便于通信,自定义一个网桥(192.168.1.180/24),使之IP与宿主主机IP ...

  8. 【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410

    作者 : 万境绝尘 转载请著名出处 终于拿到板子了, 嵌入式开发正式开启. 板子型号 : 三星 S3C6410 基于ARM11, 指令集基于arm6指令集; 为毛不是 Cortext A9的板子; 烧 ...

  9. 【Qt编程】设计ColorBar颜色栏

    画过图的都知道,我们常常用颜色的深浅来表示值的大小,在Matlab作图中,我们使用的是colorbar这个函数来给出颜色的直观参考.下面给出Matlab的示例:在Matlab命令窗口输入: figur ...

  10. ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...