所谓位运算是指二进制为对象的运算。
12.1 位运算和位运算符
位运算符:
- & 按位与
- | 按位或
- ^ 按位异或
- ~ 按位取反
- << 左移
- >> 右移
说明:
- 说明位运算符中“~”以外,均为二目(元)运算符,即要求两侧各有一个运算量。如a&b。
- 参加位运算符的对象只能是整型或字符类型的数据,不能为实型数据。
12.1.1 “按位与”运算
参加运算的两个数据按二进制进行“与”运算,如果两个相应的二进制都为1,否则该位的结果值为1;否则为0。
0&0=0 ; 0&1=0 ; 1&1=1 ; 1&0=0;
例如7&5并不等于12,应该是进行“按位与”的运算。
00000111(7) (7的二进制表示111)
00000101(5)& (5的二进制表示101)
00000101(5)
按位与的用途:
- 清零
- 取一个数中某一些指定位
- 要想将哪一位保留下来,就与一个数进行&运算,在此数在该位取1.
12.1.2 按位或
按位或运算的规则是:两个对应的二进制位中只有有一个1,该位的结果值为1.即
0|0=0;0|1=1;1|0=1;1|1=0;
12.1.3 “ 异或”运算
异或运算符“^”也称XOR运算符。它的规则是:若要参加的运算两个进制位异号,则得到1(真),若同号,则结果为0(假)。即
0^0=0 ; 0^1=1; 1^1=0; 1^0=1
"异或"的意思是判断两个相应的值是否“异”。为“异”(值不同)就取真(1);否则为(0).
异或运算的应用:
- 使特定位翻转
- 与0相^,保留原值
- 交换两个值,不用临时变量
12.1.4 "取反"运算
“~”是一个单目运算符,用来对一个二进制数按位取反,即将0变成1,1变成0.
~025是对八进制25按位取反
0000000000010101(八进制25)
~ (按位取反)
1111111111101010(八进制177752)
12.1.5 左移运算
“<<”用来将一个数的各个二进制数全部左移若干位。
a = a<<2将a的二进制数左移2位,右补零。若a=15,即二进制数00001111,左移两位00111100,得到十进制数10.高位左移溢出,舍去。
12.1.6 右移运算
a>>2表示将a的各二进制右移2位,移到右端的低位被舍弃,对无符号数,高位补0,例如a=017时,将a的二进制形式表示为00001111,右移得00000011.
右移一位相当于除以2,右移n位相当除以2
12.1.7 位运算赋值运算符
位运算符和赋值运算符可以组成复合赋值运算符。如&=,|=,^=,<<=,>>=。等
例如a&=b,相当于a=a&b;a<<=2,相当于a=<<2.
12.1.8 不同长度的数据进行位运算
如果两个数据长度不同(例如short和int)进行位运算时(如a&b,而a为short,b为int),系统就会将二者按右端对齐。如果a为正数,则左侧16位补满0;若a为负数,左侧应补满1;如果a为五符号整数型,则左侧舔满0。