算法题 20 或与加

链接:https://www.nowcoder.com/questionTerminal/729f5e6e2acc4f3cb14a2262888f86fb
来源:牛客网

给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y 。 | 是二进制的或(or)运算,例如 3 | 5 = 7。

比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。

 

输入描述:

每组测试用例仅包含一组数据,每组数据为两个正整数 x , k。 满足 0 < x , k ≤ 2,000,000,000。


输出描述:

输出一个数y。

示例1

输入

5 1

输出

2

解题思路:需要认真分析总结,得到其规律,然后在编程实现上,主要考察的是位运算的操作。

结论:把k表示成二进制数,填入x取0的比特位,x取1的比特位保持为0,得到y。

更多请参见:https://www.nowcoder.com/profile/3482365/codeBookDetail?submissionId=33064441 

参考代码如下:

x,k=[int(x) for x in input().split()]
bitNum=1
ans=0
# 目标是把k的各位依次填在x中是0的位上
while k:
    if x & bitNum==0: #bitNum不断左移,x中当前bitNUM位为0的话,把k的最低位放在这儿
        ans+=bitNum*(k&1) # k&1取k的最低位,k不断右移,直到取尽k的所有位
        k=k>>1
    bitNum=bitNum<<1
print(ans)

 

posted @ 2018-08-28 21:51  Fintech带你飞  阅读(448)  评论(0编辑  收藏  举报