Web-Development-Interview-With-Java
Web-Development-Interview-With-Java copied to clipboard
Java基础问题.md中的“ 使用异或运算的原因?(美团) ”
Issue:关于“异或运算原因”表述中&和|运算特征的修正建议
问题描述
在针对“使用异或运算的原因?(美团)”的回答中,提到
如果采用&运算计算出来的值会向1靠拢,采用|运算计算出来的值会向0靠拢
该表述与&、|运算的实际位运算特征可能存与实际在偏差。
具体分析
通过基础位运算真值表可清晰观察三种运算的结果倾向:
// AND(与运算)真值表:仅当两数对应位均为1时,结果才为1,其余情况均为0
A B AND
0 0 0
0 1 0
1 0 0
1 1 1
// OR(或运算)真值表:只要两数对应位有一个为1,结果就为1,仅当均为0时结果才为0
A B OR
0 0 0
0 1 1
1 0 1
1 1 1
// XOR(异或运算)真值表:两数对应位不同时结果为1,相同时为0,结果分布均衡
A B XOR
0 0 0
0 1 1
1 0 1
1 1 0
首先 XOR 运算确实具有最好的位混洗特性,但是结合真值表特征:
- &运算:结果为1的条件极苛刻(需双1),实际结果中0的占比远高于1,应是“更倾向于向0靠拢”,而非“向1靠拢”;
- |运算:结果为1的条件宽松(单1即可),实际结果中1的占比远高于0,应是“更倾向于向1靠拢”,而非“向0靠拢”;
所以原回答中&和|运算的“靠拢方向”表述与运算逻辑好像有些不符。