含义
&
按位与
|
按位或
∧
按位异或
∽
取反
<<
左移
>>
右移
说明:
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,cint
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
是将二进制数按照位的对应相与,得到一个新的二进制数。1与0为0;1与1为1;0与0为0。
分析如下:
就是二进制的每一位相与。
比如:1010 0011&0000 1111,结果为0000 0011。也就是与上0相当于把那位数清0,与上1相当于把那位保留。
扩展资料:
1、按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。 按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为11111111)。
参考资料:百度百科:位运算符