与,或,非,异或进行位运算的总结
1.与全零,全F的结果及应用
此处仅以32位变量x=0x12345678为例, 设O(zero)=0x00000000, F(one)=0xFFFFFFFF
x&O=0, x&F=x
x|O=x, x|F=F
x^O=x, x^F=~F
所以对于要把变量某些位置0,某些位不变,则选&
要把某些位置1,某些位不变,则选|
要把某些位变为原值的反,某些位不变,则选^
比如将x的最低有效位字节设置成全1,其他字节都保持不变,即变成0x876543FF, 则进行运算x|0x000000FF即可
2.讨论与或非异或结果的完备性
x,y进行操作之后的结果有16种(当x=0,1;y=0,1时),每一类操作只能导出一种结果,比如&操作符0&0=0,0&1=1,1&0=1,1&1=1,结果为[0,1,1,1].这样的结果有16种,两个操作数通过操作符的组合是否可以覆盖16种情况.刚开始因为三种双目操作符的结果都是对称的,写成矩阵[0,1;1,1]的形式.所以我认为不对称的结果是不能通过组合得出的,其实不然,比如[1,0;1,1]是可以通过x|~y得到的.以下是我已经得到的一些结果
[0,0;0,0] = x|~x
[0,0;0,1] = x&y
[0,0;1,0] = x&~y
[0,0;1,1] = (x&y)&(x&~y)
[0,1;0,0] = ~x&y
[0,1;0,1] = ~(x&~y)&(x|y)
[0,1,1,0] = x^y
[0,1;1,1] = x|y
[1,0;0,0] = ~(x|y)
[1,0;0,1] = x&~y
[1,0;1,0] = (x|~y)&~(x&y)
[1,0;1,1] = x|~y
[1,1;0,0] = (~x|y)&~(x&y)
[1,1;0,1] = ~x|y
[1,1;1,0] = ~(x&y)
[1,1;1,1] = ~(x&~x)
这样就证明了这四个符号可以做出任何情况