一.位操作符
&(按位与)
| (按位或)
^(按位异或)
~(按位取反)
//这里的位指的是二进制位
用法:
& //对应的二进制位有0,则为0;全1,才为1。
| //对应的二进制位有1,则为1;全0,才为0。
^ //对应的二进制位相同为0;相异为1。
~ //对应的二进制位进行取反(原来是1变为0,反之变为1)
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
int ret = 0;
ret = a & b;
ret = a | b;
ret = a ^ b;
ret = ~b;
return 0;
}
如上所示,我们可以写出3和5的二进制形式(32位)来进行分析。
3: 00000000 00000000 00000000 00000011
5: 00000000 00000000 00000000 00000101
如果将3和5进行按位与(&)的操作,3的最后3位是 011
5的最后3位是 101
根据有0,则为0;全1,才为1;则结果为 001
最后结果为:00000000 00000000 00000000 00000001
如果将3和5进行按位或(|)的操作,3的最后3位是 011
5的最后3位是 101
根据有1,则为1;全0,才为0;则结果为 111
最后结果为:00000000 00000000 00000000 00000111
如果将3和5进行按位异或(^)的操作,3的最后3位是 011
5的最后3位是 101
根据相同为0;相异为1;则结果为 110
最后结果为:00000000 00000000 00000000 00000110
如果将3和5进行按位取反(~)的操作,
假设对5进行操作,(原来是1变为0,反之变为1):
00000000 00000000 00000000 00000101
11111111 11111111 11111111 11111010
//注意,这里变形后是补码,还要转换成源码当的形式才能打印
11111111 11111111 11111111 11111001 //反码
10000000 00000000 00000000 00000110 //原码
转化位十进制后是 - 6
二.算数操作符
想必大家对 + - * / 都非常熟悉,我也只需要讲一讲 / % 的用发。
/ (除法);%(取模),它俩应当在一起比较
#include <stdio.h>
int main()
{
int a = 5;
int b = 3;
int ret = 0;
int sz = 0;
ret = a / b;
sz = a % b;
printf("%d %d",ret,sz);
return 0;
}
因为上述代代码中的变量都是int型,%d打印出的都是十进制整数,
所以ret = 1,
%(就是取出计算后的余数),sz = 2
三.移位操作符
<< 左移操作符 例: int a = 5; int b = a<<2;
>> 右移操作符 //把a在内存中存储的二进制位(补码)向左移两位
//最后转化位原码返回
值得注意的是对于右移操作符而言,实际上有两种运算方式:
1.算数右移(右边丢弃,左边补原来的符号位)
2.逻辑右移(右边丢弃,左边补0)
// 一般都是算数右移,但其实是取决于编译器的
四.复合赋值符
+= -= /= %= &= |= ^= >>= ...
诸如此类,都是类似与 a + = 10 --> a = a +10
五.单目操作符
a++ 与 ++a 的区别就是前者是先使用,再加一;后者是先加一,再使用。
对于sizeof的用法请看如下链接
写文章-CSDN博客https://mp.csdn.net/mp_blog/creation/editor/122213218
! 叫做逻辑反操作
#include <stdio.h>
int main()
{
//C语言中0表示假,非0表示真
int a = 0;
printf("%d",!a);
return 0;
}
打印的结果为1(所有非0的数都会打印0)
六.逻辑操作符
&& (逻辑与) 和 ||(逻辑或) 都是逻辑操作符
例如在for( ; a > 0 && b > 0 ; ) //有一个错误则跳出循环
for( ; a > 0 || b > 0 ; ) //全部错误才跳出循环
七.条件操作符
exp1?exp2:exp3 //实际上是简化if语句
MAX = (a > b ? a : b)
//若a > b,则将a的值赋给MAX,若不是,则将b的值赋给MAX
八.逗号表达式
(exp1,exp2,exp3,.....)
//从左向右一次计算,取最后的一个值为最终结果。