“x&y是取相同的位与,这个的结果是x和y相同位的一半,x^y是取x和y的不同位,右移相当于除以2” 位运算我知道是咋回事,但是他说的解释我不明白。请各位老师指教
假设两个数的二进制分别是10101111和10010011
10101111=10000011+00101100
10010011=10000011+00010000
我们把它们拆分成两个数字,第一个是每一位如果相同,取这一位的值,不同的取0;第二个数字是如果这一位相同,取0,如果不同,取这一位的值。
这样两个值相加等于左边的值,这个能理解么?
10000011+10000011=2个(10000011),10000011 and 10000011=10000011,也就是1个(10000011),所以说是一半
右边,因为我们取的不同位,所以如果第一个数字这一位是1,另一边肯定是0,或者相反,不可能都是1,所以
00101100 or 00010000 = 00101100 + 00010000
>>1 相当于除以2(好比10进制,1000移动1位成为100,是除以10)
所以右边也是两数相加的一半。
因为左边右边相加等于原来的数字,所以两边都是一半也就是原来的数字的一半。
好比
a/2+b/2=(a+b)/2
当然了,这问题看了题解我能知道是怎么回事,但是我不信如果没有做过类似题,一眼看过去能想到这个方法。我不认为这是一个好的面试题。
作为程序员,我觉得有两个知识点是必须掌握的,一个是当两个数,所有的二进制位都不同时为1,那么a or b = a + b,另一个是移位运算相当于 *2 /2