这题真的体现了自己思维的不足,考虑问题只是考虑他的特殊性,却不能总结出它的一般性规律。
对于这题, 如果L == R , 那么结果为0.
否则, 我们只需要找到最高的某一位 (二进制数中的某一位, 设为第p位, 从0开始编号),
使得要找的两个数从最高位到最低位, 在第p位第一次出现不同,如 11110000 和 11101111, 这里 p = 4.
这样,结果就是 (2^p) ^ (2^p -1)
附上代码:
1 l, r = map(long, raw_input().split()) 2 if l == r: 3 print 0 4 else: 5 p = 0 6 for i in xrange(61): 7 if ((1 << i) & r > 0) and ((1 << i) & l) == 0: 8 p = i 9 print (1 << p) ^ ((1 << p) - 1)