• 位运算符详解


    1. 运算符 

    &   按位与  
    |   按位或  
    ∧   按位异或  
    ∽   取反  
    <<   左移  
    >>   右移  

    说明:

    1>位运算符中除∽以外,均为二目(元)运算符,即要求两侧各有一个运算了量。

    2>运算量只能是整形或字符型的数据,不能为实型数据。

                                                            

    •    “按位与”运算符(&)    

             规定如下:

      0&0=0   0&1=0   1&0=0   1&1=1  

               例:3&5=?
                               先把3和5以补码表示,再进行按位与运算。

      3的补码:   00000011  
      5的补码:   00000101  

      结果:   00000001  

          3&5=1

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

    •    “按位或”运算符(|)    

               规定如下:

      0|0=0   0|1=1   1|0=1   1|1=1  

               例:060|017=?
                               将八进制数60与八进制数17进行按位或运算。                        

      060   00110000  
      017   00001111  

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

    •    “异或”运算符(∧),也称XOR运算符    

               规定如下:

        0∧0=0   0∧1=1   1∧0=1   1∧1=0  

              例:57∧42=?
                             将十进制数57与十进制数42进行按位异或运算。                        

      57   00111001  
      42   00101010  

      结果:   00010011  

          57∧42=19

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

    •    “取反”运算符(∽)    

               规定如下:

        ∽0=1   ∽1=0  

               例:∽025=?
                               对八进制数25(即二进制0000000000010101)按位求反。

      0000000000010101  
      ↓  
      1111111111101010  

                             ∽025=177752

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

    •    左移运算符(<<)    

     

           将一个数的二进位全部左移若干位,若高位左移后溢出,则舍弃,不起作用。

             例:a=a<<2
                             将a的二进制数左移2位,右补0。
                             若a=15,即二进制数00001111,则

    a   00001111  
    ↓   ↓  
    a<<1   00011110  
    ↓   ↓  
    a<<2   00111100  

                             最后a=60

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

    •  右移运算符(>>)    

     

           将一个数的二进位全部右移若干位,低位移出部分舍弃。

             例:a=a>>2
                             将a的二进制数右移2位,左补0。
                             若a=15,即二进制数00001111,则

      a   00001111  
      ↓   ↓  
      a>>1   00000111  
      ↓   ↓  
      a>>2   00000011  

                  最后a=3

    位运算符与赋值运算符结合可以组成扩展的赋值运算符

             如:&=,|=,>>=,<<=,∧=

             例:a&=b相当于a=a&b

                         a<<=2相当于a=a<<2

    • 左移与右移运算符

      左移相当于*2,只是要注意边界问题。如char a = 65; a<<1 按照*2来算为130;但有符  号char的取值范围-128~127,已经越界,多超出了3个数值,所以从-128算起的第三个数  值-126才是a<<1的正确结果。
      而右移相当于除以2,只是要注意移位比较多的时候结果会趋近去一个非常小的数,如上面  结果中的-1,0。

      

    2. 不同长度的数据进行位运算

             如果两个数据长度不同(例如long型和int型)进行位运算时(如a&b,而a为long型,b为int型),系统会将二者按右端对齐。如果b为正数,则左侧16位补满0。若b为负,左端应补满1。如果b为无符号整数型,则左端添满0。

    位运算举例
             例:取一个整数a从右端开始的4∽7位

                     考虑如下:1、先是a右移4位,即a>>4

                                         2、设置一个低4位全为0的数,即∽(∽0<<4)    

                                         3、将上面两式进行与运算,即a>>4&∽(∽0<<4)    

                     程序如下:

                                             main()

                                             {unsigned   a,b,c,d;

                                               scanf("%o",&a);

                                               b=a>>4;

                                               c=∽(∽0<<4);

                                               d=b&c;

                                               printf("%o %o ",a,b);

                                             }

                     结果:331↙

                         331(a的值,八进制)

                         15   (d的值,八进制)

    例:循环移位。要求将a进行右循环移位。即a右循环移n位,将a中原来左面(16-n)位右移n位。现假设两个字节存放一个整数。如右图。    

                     考虑如下:1、先将a右端n位放到b中的高n位中,即:b=a<<(16-n)

                                         2、将a右移n位,其左面高位n位补0,即c=a>>n

                                         3、将c与b进行按位或运算,即c=c|b  

                     程序如下:

                                             main()

                                             {unsigned   a,b,c;int   n:

                                               scanf("a=%o,n=%d",&a,&n);

                                               b=a<<(16-n);

                                               c=a>>n;

                                               c=c|b;

                                               printf("%o %o",a,c);

                                             }

                     结果:a=157653,n=3↙

                         331(a的值,八进制)

                         15   (d的值,八进制)

    位段
    所谓位段是以位为单位定义长度的结构体类型中的成员。

             例:struct   packed-data

                                     {unsigned   a:2;

                                       unsigned   b:6;

                                       unsigned   c:4;

                                       unsigned   d:4;

                                       int             i;

                                     }data;

  • 相关阅读:
    vision transformer
    亮剑,gacutil.exe
    MOSS自定义登陆页面
    查看应用程序的进程ID
    基于AD的表单认证 Moss2010
    js 实现拖动
    获取指定数据库表, 以及指定表的数据信息
    二分法
    JZ053表示数值的字符串
    JZ054字符流中第一个不重复的字符
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5573115.html
Copyright © 2020-2023  润新知