关于C语言逻辑运算符的应用

来源:互联网 发布:php 注入过滤 编辑:程序博客网 时间:2024/05/17 09:30

最近在看C语言的一本书《The C programming language(中文版)》,上面有几个关于逻辑运算的小问题比较有意思。

你也可以去这个博客上看一下。 这个博客关《The C programming language(中文版)》这本书上习题的答案比较全面。这里主要讲一下C语言逻辑运算符&(与)、|(或)、~(非)、^(异或)。

&(与):只有当两个数都为1时,结果才为1。即1&1=1,0&1=0,1&0=0,0&0=0。
|(或):只要有一个数为1时,结果就为1。即1|1=1,0|1=1,1|0=1,0|0=0。
~(非):所有的数都取反。即~1=0,~0=1。
^(与):只有当两个数不相同时,结果才为1。即1^1=0,0^1=1,1^0=1,0^0=0。

这里我们就总结一个问题:

&(与):a&1结果是什么?a&0呢?
|(或):a | 1结果是什么?a | 0呢?
^(与):a^1结果是什么?a^0呢?

结论:
a&1 = a , a&0 = 0 , a | 1 = 1 , a | 0 = a , a^1 = ~a , a ^ 0 = a 。
这就相当于一个公式了。

这里给一个数10001001111 , 让你用逻辑运算符取出这个数中间的三位数,并输出。
这时候你会怎么思考?

.
.
.
.





.
.
.
.

我会把这个分成三部分:1000 | 100 | 1111 。其中中间加粗的100是我们要取出的值。要想取出,首先要把100两边的值都变为0,即变成0000 | 100 | 0000。怎么样才能变成这个样子呢?看上边的公式,结果为0的只有一个a & 0 = 0,这里我们就可以确定用&(与)运算了。我们取的值要保持不变,这时候就一看a&1 = a,保持不变。那么我们就用1000 | 100 | 1111 & 0000 | 111 | 0000 就得到了 0000 | 100 | 0000,然后再右移4位(>>4)就得到了你想要的值。
那么0000 | 111 | 0000怎么得到呢?
结果:
0 = 0000 000 0000 ——>
0取反得: ~0 = 1111 111 1111 ——>
~0左移3位:~0 << 3 = 1111 111 1000 ——>
再将得到的数取反:~(~0<<3) = 0000 000 0111——>
再左移4位:~(~0<<3)<<4 = 0000 111 0000。
就得到了想要的结果。

那我们再来思考一个问题,如果只让上边的数中间的三位改变,该怎么办呢。也就是两边的数不变,那么结果为a的公式中有三个a&1 = a,a | 0 = a,a ^ 0 = a。然后根据要求去获得相应的数字,然后一步步的变换。

免费的《The C programming language(中英文版)》(码云)

csdn上《The C programming language(中英文版)》1积分