位运算

作者: M_JCs | 来源:发表于2017-02-17 10:13 被阅读140次

    位运算包括逻辑运算和移位运算,相应地,位运算符包括逻辑运算符(包括~、&、|和^)和移位运算符(包括>>、<<和>>>)。

    1、逻辑运算符

    1.1 & 位与运算

    位与运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑与运算。例如:int型常量4和7进行位与运算的运算过程如下:4=0000 0000 0000 0100 &7 =0000 0000 0000 0111= 0000 0000 0000 0100。

    1.2 | 位或运算

    位或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑或运算。例如:int型常量5和7进行位或运算的表达式为5|7,结果如下:5= 0000 0000 0000 0101 | 7= 0000 0000 0000 0111=0000 0000 0000 0111。

    1.3 ^ 位异或运算

    位异或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑异或运算。只有当对应位的二进制数互斥的时候,对应位的结果才为真。例如:int型常量5和7进行位异或运算的表达式为5^7,结果如下:5=0000 0000 0000 0101^7=0000 0000 0000 0111 = 0000 0000 0000 0010。

    1.4 ~ 位非运算

    位非运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑非运算。

    2、移位运算符

    2.1 位左移运算

    左移运算的实质是将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃。例如int a,b;

    a=5;

    b=a<<2;

    则b=20,分析过程如下:
    (a)10=(5)10=(0000 0000 0000 0101)2
    b=a<<2;
    b=(0000 0000 0001 0100)2=(20)10
    从上例可以看出位运算可以实现二倍乘运算。由于位移操作的运算速度比乘法的运算速度高很多。因此在处理数据的乘法运算的时,采用位移运算可以获得较快的速度。提示:将所有对2的乘法运算转换为位移运算,可提高程序的运行效率。

    2.2 位右移运算

    位右移运算的实质是将对应的数据的二进制值逐位右移若干位,并舍弃出界的数字。如果当前的数为无符号数,高位补零。例如:
    int (a)10=(5)10=(0000 0000 0000 0101)2
    b=a>>2;
    b=(0000 0000 0000 0001)2=(1)10
    如果当前的数据为有符号数,在进行右移的时候,根据符号位决定左边补0还是补1。如果符号位为0,则左边补0;但是如果符号位为1,则根据不同的计算机系统,可能有不同的处理方式。可以看出位右移运算,可以实现对除数为2的整除运算。
    提示:将所有对2的整除运算转换为位移运算,可提高程序的运行效率。

    2.3 复合位运算符

    在C语言中还提供复合的位运算符,如下:
    &=、!=、>>=、<<=和^=
    例如:a&=0x11等价于 a= a&0x11,其他运算符以此类推。
    不同类型的整数数据在进行混合类型的位运算时,按右端对齐原则进行处理,按数据长度大的数据进行处理,将数据长度小的数据左端补0或1。例如char a与int b进行位运算的时候,按int 进行处理,char a转化为整型数据,并在左端补0。
    补位原则如下:

    1. 对于有符号数据:如果a为正整数,则左端补0,如果a 为负数,则左端补1。
    2. 对于无符号数据:在左端补0。

    相关文章

      网友评论

          本文标题:位运算

          本文链接:https://www.haomeiwen.com/subject/alukwttx.html