一、位运算
定义:C语言中提供的可以直接操作整数中的位的运算符;
1.1按位与、或、异或、取反运算
C语言中并不存在8位整数的位运算,故而操作数在做位运算之前都至少被提升为int型。
注意提升为整数后高位填充的0或者1在取反时都要进行运算的,千万不要忽视!!!
1.2移位运算
注意:移位的位数必须小于左操作数的总位数;
在一定的取值范围内,讲一个整数左移一位相当于乘以2;
建议只对无符号数做位运算,以减少出错的可能。
1.3掩码
对给定整数中的某些位进行处理;
1.4异或运算的特性:
①与自己做异或结果为0;
②与0异或还为自己,与1异或为相反值;
☂奇偶校验
④最神奇的功效:交换两个变量的值
常用方法: temp=a;a=b;b=temp;
借助于位运算==> a=a^b;b=b^a;a=a^b;
第二步中,b=b^(a^b)=b^a^b=a;
第三步中,同理可得a=b;
练习1:
不得借助额外的空间,交换两个变量的值;
还有一种方案:
a=a+b;
b=a-b;
a=a-b;
不过,大家应该会更倾向于位运算;
二、其他运算符
2.1复合赋值运算符
例:a+=1;<=等价于=>a=a+1;但其实是有差距的,前者只计算一次a,后者需要两次,即会存在效率问题;
当有side effect时,则执行的最终结果不同;
2.2条件运算符
表达式1?表达式2:表达式3
表达式1必须为标量;
表达式2和表达式3的类型要求一致;
2.3逗号运算符
左结合,但最终只返回最右边表达式的值作为最终结果。
2.4sizeof运算符与typedef类型声明
sizeof表达式;该表达式中的子表达式并不求值;因为在编译阶段就已经知道该子表达式的类型了,故而无需再运行阶段进行计算;
注意:sizeof的运行结果是size_t,该类型定义在头文件stddef.h中;