与、或、异或运算
2018-01-09 17:36
190 查看
原文:http://blog.csdn.net/abc785442154abc/article/details/48086601
[cpp] view
plain copy
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)好啦,掌握了&(与运算)、|(或运算)、^(异或运算)的本质,以后涉及这类题便可瞬间秒杀
[cpp] view
plain copy
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)好啦,掌握了&(与运算)、|(或运算)、^(异或运算)的本质,以后涉及这类题便可瞬间秒杀
相关文章推荐
- 异或加密法 在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算。 解密的方法就是再执行一次同样的操作。
- 输入一个32位的整数啊,使用按位异或运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果
- java中把两个变量进行值交换,通过异或两次运算就能实现值互换。
- 训练三层BP神经网络实现异或运算 Python 代码实现
- hdu2095 像水题的不错题 异或运算
- 异或运算及其应用
- 异或运算的妙用
- 使用异或运算实现两数交换
- java对文件简单的加密解密(异或运算)
- 按位与、或、异或、取反运算
- C的|、||、&、&&、异或、~、!运算
- HDU 1287 破译密码 异或运算
- C的|、||、&、&&、异或、~、!运算
- HDOJ 1287 破译密码(异或运算)
- 按位与、或、异或等运算方法
- 2014年2月19日 java中的异或运算
- 与运算与异或运算的应用
- 逻辑运算符的“异或”运算
- 按位与、或、异或等运算方法
- 使用异或运算 不借助临时变量交换两个数