1、按位运算符
1.1 按位或 ( | ) 和 按位与 ( & )
上期我们讲到过逻辑或和逻辑与,他们得到的结果是真假值,但我们一定要区分清楚,按位运算符 "|" 和 "&" 与逻辑运算符 "||" "&&" 是完全两个概念。
按位,简明之意,按数值二进制位来进行运算,都是在数据补码的基础上进行。
按位或 "|" : 两个数值的二进制补码对应位进行运算,对应位有 1 则为 1 ,否则为 0。
按位与"&":两个数值的二进制补码对应位进行运算,对应位都为 1 则为 1, 否则为 0。
这里我们举例说明:
1 | 2 :
1 的二进制补码:0000 0000 ... 0000 0001
2 的二进制补码:0000 0000 ... 0000 0010
------按位或结果: 0000 0000 ... 0000 0011 -> 对应十进制:3
1 & 2:
1 的二进制补码:0000 0000 ... 0000 0001
2 的二进制补码:0000 0000 ... 0000 0010
------按位与结果: 0000 0000 ... 0000 0000 -> 对应十进制:0
其实有很多大学老师或者是书上都有可能把按位或,按位与,以及后面我们要讲的按位异或,他们会把每位二进制运算后的结果称为真或者假,其实这样的说法是不够严谨的,真假是逻辑判断,而按位运算得到的结果是数值,而且在C语言中0表示假,非0为真,所以我是不推荐这种说法。
1.2 按位异或 ( ^ )
按位或 "^" : 两个数值的二进制补码对应位进行运算,相同为 0 , 不同为 1。
这里我们举例说明:
1 ^ 3 :
1 的二进制补码:0000 0000 ... 0000 0001
3 的二进制补码:0000 0000 ... 0000 0011
---按位异或结果: 0000 0000 ... 0000 0010 -> 对应十进制:2
5 ^ 0 :
5 的二进制补码:0000 0000 ... 0000 0101
0 的二进制补码:0000 0000 ... 0000 0000
---按位异或结果: 0000 0000 ... 0000 0101 -> 对应十进制:5
结论:任何数异或0都等于它本身
这里有一道笔试题:不创建临时变量,实现两个数的交换。
//很多小伙伴直接想出来的做法: int main() { int a = 10; int b = 20; printf("a = %d, b = %d\n", a, b); a = a + b; b = a - b; a = a - b; printf("a = %d, b = %d\n", a, b); return 0; }