位运算符

来源:互联网 发布:开发人员从事数据分析 编辑:程序博客网 时间:2024/06/16 01:35
运算符   含义  
&   按位与  
|   按位或  
∧   按位异或  
∽   取反  
<<   左移  

>>   右移 

说明:

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  

--------------------------------------------------------------------------------
 
|:   00111111  

 060|017=077


   “异或”运算符(∧),也称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


   “异或”运算符(∧),也称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


  左移运算符(<<)    

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

         例: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   00011110  
↓   ↓  
a<<2   00111100  
最后a=60


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

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

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

                     a<<=2相当于a=a<<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\n%o\n",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\n%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;


原创粉丝点击