您的位置:首页 > 编程语言 > C语言/C++

c语言操作符---位操作符、移位操作符

zhangye3017 2017-10-13 20:21 72 查看
1、按位操作符

 

 1.1 按位“与”&(双目运算符):仅当两个操作数都为1时,结果为1,否则为0。参与运算的数以补码方式出现。

    例:9&5=1

        0000 1001-------------   9的补码

     &  0000 0101-------------    5的补码

       ----------

        0000 0001-------------    1的补码

         应用:

    a、通常将某些位清零或保留某些位。例如:将a的高八位清零,保留低八位,可做a&255运算。

      00000000 11111111—————— 255的二进制数

      00000000 00100000—————— a的二进制数

     ------------------

      00000000 11111111

   b、取某数的指定位。例如:设a=1000 1110,要取出a中第二位的1,则可以用 a & 0000 0010 实现。

 1.2 按位“或”|(双目运算符):仅当两个操作数都为0时,结果为0,否则为1。

      例:9|5=13

         

        0000 1001------------- 9的补码
     |  0000 0101------------- 5的补码
       ----------
        0000 1101------------- 13的补码
    应用:常用来将源操作数某些位置1。例如:设a=0100 0001,将低四位全部置1,则可以用 a | 0000 1111 实现。

1.3 按位“异或”^(双目运算符):参加运算的两数各对应的二进位相异或,当对应的二进位相异时,结果为1.

   例: 9^5=12

    

        0000 1001------------- 9的补码
     ^  0000 0101------------- 5的补码
       ----------
        0000 1101------------- 12的补码
 应用:

    a、特定位置取反。例如:设a=1001,将第2位取反,则可以用 a ^1011 实现。

    b、不引入第三变量,交换两个数的值。

       例:a=1,b=2,交换两个数的值

        a=a^b;                 

        b=a^b;              

        a=a^b;                

  

       001                011           011

     ^ 010            ^   010        ^  001

     ————           ————      ————

       011                001           010

 

2、移位操作符

 2.1 左移运算 <<(丢弃最高位,0补最低位):把一个数的所有位都向左移动若干位。

      

         例如:int i=1;i=i<<2;    //这表示将i里的值左移两位。

    

   分析:1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000... 0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(注:有符号数不完全适用)

   2.2  右移运算   >>:把一个数的所有位都向右移动若干位。

     

        例如:int i =
0x80000000;

            i = i >> 1;  //i的值不会变成0x40000000,而会变成0xc0000000

    分析:符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移。同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位。

     总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.

      
标签: