§4.6 位运算符与位表达式
位是计算机存储数据的最小单位。一个二进制位可以表示两种状态(1和0),多个二进制位组合起来便可表示多种信息。那么, 什么是二进制呢?
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以【补码】的形式存储的。例如:
1 -> 0000 00012 -> 0000 00103 -> 0000 0011-1 -> 1000 0001
注意:
二进制:
用 0 和 1 表示(8位), 最左边(最高位)是符号位:0表示正数, 1表示负数
正数:
原码、反码、补码相同
负数:
原码:
对应正数部分转换二进制后, 高位补1
反码:
符号位除外,原码其余各位按位取反, 0 -> 1, 1 -> 0
补码:
反码 + 1(原码取反 + 1),
如何将一个十进制数转化成二进制数?
十进制数转成二进制主要有以下几种:
正数:
除二取余,然后倒序排列,高位补零
eg:
(115)10=(01110011)2
负数:
先是将对应的正整数转换成二进制后,高位取1,对二进制取反,然后对结果再加 1
eg:
(-1)10 = (1000 0001)2
小数:
对小数点以后的数乘以 2,有一个结果吧,取 结果的整数部分(不是 1 就是 0),然后再用小数部分 再乘以 2,再取结果的整数部分……以此类推,直到小数部分为 0 或者位数已经够了则停止运算。然 后 把获得的整数部分按先后次序排列,就构成了二进制小数部分的序列;如果小数的整数部分有大于 0 的 整数时该如何转换呢?如以上整数转换 成二进制,小数转换成二进制,然后拼接在一起即可)
eg:
(1.125)10 = (00000001.001)2
§4.6.1 位运算符
C语言完全支持位运算,而且也能像汇编语言一样用来编写系统程序。具体符号和对应功能如下图表所示:

注意:
按位与(&):
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
按位或(|):
1 | 1 = 1
0 | 1= 1
1 | 0 = 1
0 | 0 = 0
按位异或(^):
1 | 1 = 0
0 | 1= 1
1 | 0 = 1
0 | 0 = 0
按位取反(~):
1 -> 0, 0 -> 1
公式: ~num = -(num + 1)
注意: 按位取反时, 包含符号位
左移(<每移一位, *2, 左移时, 符号位不动, 右边空出的位置用0填充
右移(>>):
每移一位, /2,右移时,符号位不动, 左边空出的位置用与符号位相同的数值填充
§4.6.2 位表达式
在表达式中使用位运算符, 则该表达式称为位表达式。
eg:
#include int main(int argc, const char * argv[]) { int iNum_1 = 3; int iNum_2 = -5; printf("iNum_1 & iNum_2 = %d", iNum_1 & iNum_2); printf("iNum_1 | iNum_2 = %d", iNum_1 | iNum_2); printf("iNum_1 ^ iNum_2 = %d", iNum_1 ^ iNum_2); printf("~iNum_2 = %d", ~iNum_2); printf("iNum_1 >> 2 = %d", iNum_1 >> 2); printf("iNum_1 << 2 = %d", iNum_1 << 2); return 0;}/*输出结果*//*iNum_1 & iNum_2 = 3iNum_1 | iNum_2 = -5iNum_1 ^ iNum_2 = -8~iNum_2 = 4iNum_1 >> 2 = 0iNum_1 << 2 = 12*/
§4.7 逗号运算符与逗号表达式
§4.7.1 逗号运算符
C语言中逗号运算符用于将多个表达式分割开来,使用【,】表示。具体符号和对应功能如下图表所示:

§4.7.2 逗号表达式
在表达式中使用逗号运算符, 则该表达式称为逗号表达式。使用逗号运算符分割的表达式将被分别计算,并且整个表达式的值是最后一个表达式的值。
格式:
(表达式1, 表达式2, 表达式3, ... , 表达式n);
注意:
逗号表达式的求解过程是:先求解表达式1, 再求解表达式2,一直求解到表达式n,整个逗号表达式的值是表达式n的值。
eg:
#include int main(int argc, const char * argv[]) { int iNum_1 = 10, iNum_2 = 43, iNum_3 = 26, iResult = 0; iResult = iNum_1 ++, --iNum_2, iNum_3+4; printf("iResult = %d", iResult);//iResult = 10 iResult = (iNum_1 ++, --iNum_2, iNum_3 + 4); printf("iResult = %d", iResult);//iResult = 30 return 0;}
§4.8 复合赋值运算符与复合赋值表达式
§4.8.1 复合赋值运算符
复合赋值运算符是C语言中算术运算符与赋值运算符相结合而产生的一种运算符简写形式。具体符号和对应功能如下图表所示:

§4.8.2 复合赋值表达式
在表达式中使用复合赋值运算符, 则该表达式称为复合赋值表达式。复合赋值表达式是通过先进行算术运算,然后再将运算结果赋值给变量自身。
eg:
#include int main(int argc, const char * argv[]) { int iNum = 10; iNum += 5; printf("+= iNum = %d", iNum); iNum -= 5; printf("-= iNum = %d", iNum); iNum *= 5; printf("*= iNum = %d", iNum); iNum /= 5; printf("= iNum = %d", iNum); iNum %= 5; printf("mod(iNum) = %d", iNum); return 0;}/*输出结果*//*+= iNum = 15-= iNum = 10*= iNum = 50= iNum = 10mod(iNum) = 0*/
§4.9 自增和自减运算符
C语言中包含两个特殊运算符:自增运算符【++】和自减运算符【—】。自增或自减运算符对变量的操作分别是变量自增1与自减1。
§4.9.1 自增运算符
自增运算符根据代码编写时相对于操作数放置的位置,可分为:前置自增与后置自增两种。
eg:
++iNum;//前置自增fNum++;//后置自增
注意:
前置自增,先进行自增运算,然后再使用增后的新值参与其他运算。
后置自增,先使用变量当前的值参与其他运算,然后再进行自增运算。
eg:
#include int main(int argc, const char * argv[]) { int m, n; m = 1; m++;//2 printf("m = %d , n = %d", m,n); n = m++;//m:3 n:2 printf("m = %d , n = %d", m,n); n = ++m ;//4, 4 printf("m = %d , n = %d", m,n); return 0;}
§4.9.2 自减运算符
自减运算符根据代码编写时相对于操作数放置的位置,可分为:前置自减与后置自减两种。
eg:
--dNum_1;//前置自减dNum_2--;//后置自减
注意:
前置自减,先进行自减运算,然后再使用减后的新值参与其他运算。
后置自减,先使用变量当前的值参与其他运算,然后再进行自减运算。
eg:
#include int main(int argc, const char * argv[]) { int m, n; m = 1; m++;//2 printf("m = %d , n = %d", m,n); n = --m; printf("m = %d , n = %d", m,n); n = m++;//m:3 n:2 printf("m = %d , n = %d", m,n); n = ++m ;//4, 4 printf("m = %d , n = %d", m,n); m--;//4, 3 printf("m = %d , n = %d", m,n); return 0;}
§4.10 sizeof运算符
C语言中不同数据类型在计算机内存中占用不同大小的内存空间,为获取操作数在当前操作系统中所占的字节数(bytes)大小,可使用sizoof()运算符。
格式:
sizeof(操作数);
eg:
#include int main(int argc, const char * argv[]) { int iNum = 10; printf("sizeof(iNum) = %ld", sizeof(iNum));//sizeof(iNum) = 4 printf("sizeof(int) = %ld", sizeof(int));//sizeof(int) = 4 return 0;}
§4.11 条件运算符
C语言中,条件运算符属于三目运算符,使用【?:】表示。通过条件运算符可对一个表达式的真假情况进行检验,然后根据检验结果返回另外两个表达式中的一个。
格式:
表达式1 ?表达式2:表达式3;
eg:
#include int main(int argc, const char * argv[]) { int iNum = 10; int result = (iNum > 20) ? (iNum + 10) : (iNum + 50); printf("result = %d", result); //60 return 0;}
§4.12 运算符优先级和结合型
