位运算(C语言按位计算只有十进制、八进制、十六进制无二进制)
1、位运算的操作对象只能是整型(-128-127)或者字符型数据。
C语言提供六种位运算
& 按位与(乘) | 按位或 ^异或 ~取反 << 左移 >>右移
计算:
非二进制转换成二进制进行计算,算出的结果是二进制,在还原成非二进制(计算中不产生借位和进位)
(1)&计算(全1为1,有0为0)--------按位乘
作用:清零
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
//区别
2 & 5 = 0
2 && 5 = 1
(2)|运算--------按位加
两个相应的二进制位只要有一个1,则他们按位或运算后结果为1
作用:将特定位置1
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
//区别
2 | 5 = 7
2 || 5 = 1
(3)按位异或运算(^)--------相异为1,相同为0
//最高位为0代表正(+)数则原码
//最高位为1代表负(-)数,补码:后面的数按位取反+1
当两个相应位同为1或同为0时,按位异或结果位0,当两个相应位一个是0一个是1,按位异或的结果是1
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
2 ^ 5 = 7
(4)按位取反运算(~)
单目运算符。按位取反0变1,1变0
~1 = 0
~0 = -1 //0按位取反有16个1,最高位为1.为负数,将后面的15个1取反得到0再+1(-1)
对于一个数按位取反得到的值为该数+1后再乘以-1。
(5)按位左移运算(<<)向右补0
//功能:将二进制按位依序左移n位
对一个十进制数左移n位后得到的值位该数乘以2^n的积
2<<4 = 32
(6)按位右移运算(>>)向左消0
//功能:将二进制按位依序右移n位
若该数为一个负数并且不能被2^n整除,则得到的数为商加-1
计算方法:数/2^n 数/2^n+(-1)
复合赋值运算符:
&=、|=、^=、<<=、>>=
例题:
//计算表达式
int b = 2;
(b >> 2) / (b >> 1) = 0
main(){
char x = 040;
printf("%O\n",x<<1);
}
//预期结果
100