首页 > 建站教程 > JS、jQ、TS >  &(与运算)、|(或运算)、^(异或运算)的本质理解正文

&(与运算)、|(或运算)、^(异或运算)的本质理解

int a=729;
int b=271;
printf("%d \n",(a & b) +(a ^ b)>>1);
printf("%d  \n",(a & b) +(a | b));
输出结果:500;1000

(1)这道题咋看上去是位运算,一步一步进行位运算,不会吧,很low的。那么有什么捷径呢?

(2)好的,我们来读懂这道题的含义。先来说说各种位运算的本质吧。

&运算:相当于十进制 相同位做加法的1/2

0101 & 0011   结果:二进制0001             十进制 (2^0 +2^0)/2          这里的"^"代表次幂

|运算:相当于十进制 相同位做加法的1/2与不同位做加法求和

0101 | 0011   结果:二进制0111             十进制 (2^0 +2^0)/2 +(2^2 +2^1)

^运算:相当于十进制不同位做加法

0101 ^ 0011  结果:二进制0110           十进制(2^2 + 2^1 )

(3)好了,我们用(2)所示的方法再来求解这道题试试

第一个输出结果的含义:729、271相同位做加法的1/2 与 729、271不同位做加法的1/2(右移1位相当于除2)求和,哎呀,这个含义不就是729与271求平均数吗,OK,结果就是500。
第二个输出结果的含义:729、271相同位做加法的1/2,729、271相同位做加法的1/2,729、271不同位做加法求和,三个结果的和,哎呀呀,这个含义不就是729与271求和吗,OK结果就是1000啦。

(4)好啦,掌握了&(与运算)、|(或运算)、^(异或运算)的本质,以后涉及这类题便可瞬间秒杀