c语言位运算符

c语言位运算符

C语言既具有高级语言的特点,又具有低级语言的功能。

          所谓位运算是指进行二进制位的运算。

          C语言提供的位运算:

运算符    含义 
&    按位与 
|    按位或 
∧    按位异或 
∽    取反 
<<    左移 
>>    右移 

说明:

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

    “取反”运算符(∽)   

          规定如下:

∽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

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

          如果两个数据长度不同(例如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;

转自:http://hi.baidu.com/cst19841103/blog/item/a62d1b115cdfffc0a6ef3f4c.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值