c语言位运算符

转载 2012年03月22日 21:59:11

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

C语言位运算符及常见用法

一、位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 >> 右移 1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有...
  • xing_hao
  • xing_hao
  • 2011年08月11日 09:46
  • 29017

位运算符C语言

 一、位运算符C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反>> 右移1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进...
  • weilaixi
  • weilaixi
  • 2009年02月23日 13:35
  • 22844

C语言位运算符总结

C语言的运算符是一个很有意思的东西,运用起来可以解决很多麻烦的事,但是想要灵活应用也有一定的难度,总结一下c语言运算符的用法和一些常用技巧. 一.C语言位运算符简介 C语言的位运算符有六种,分...
  • yang6816110
  • yang6816110
  • 2013年06月09日 22:53
  • 795

c语言学习笔记(8)位运算符,++,--运算符的用法

摘要:总结了位运算符,++,--运算符的用法,给出了一个使用异或方法巧解面试题的例子,分析了贪心法的规则。 一、位运算符用法     c语言中的位运算符主要有以下几种:      ...
  • Deep_l_zh
  • Deep_l_zh
  • 2015年09月28日 17:45
  • 2337

C语言中的逻辑运算符和位运算符总结

老分不清一个&号和俩的用法,今天专门拿出来整理整理:一、逻辑运算符:   包括:1。&&逻辑与 2。||逻辑或 3。!逻辑非   逻辑运算符用于对包含关系运算符的表达式进行合并或取非   对于使用逻辑...
  • stevenzhang1986
  • stevenzhang1986
  • 2011年06月21日 14:24
  • 6038

c语言——位运算符及用法

1;位运算; 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。(均以二进制的补码形式) 整数;及只能是带符号或者无符号的char,sh...
  • zw1996
  • zw1996
  • 2016年09月22日 13:14
  • 619

C语言六种“位运算符”

C语言六种“位运算符”
  • u012079603
  • u012079603
  • 2013年10月28日 11:28
  • 913

C语言之位移位运算符和按位运算符

近期做串口实验,遇到将十六进制转换成char型字符的问题,程序中用到了位移位运算符和按位或运算符 a. 位移位运算符      >右移      运算符左边为移位对象,右边为要移的位数。移位对象为...
  • BlueCloudMatrix
  • BlueCloudMatrix
  • 2012年12月01日 21:17
  • 1505

C语言中的所有运算符用法及总结

1
  • sigma_inf
  • sigma_inf
  • 2017年03月26日 16:45
  • 1814

C语言运算符级别分类

1级(左结合)   ( ) 圆括号;[ ]下标运算符;->指向结构体成员运算符;. 结构体成员运算符。   2级(右结合)   “ ! ”逻辑非运算符;“ ~ ”按位取反...
  • yuleslie
  • yuleslie
  • 2012年07月01日 20:06
  • 712
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言位运算符
举报原因:
原因补充:

(最多只允许输入30个字)