码迷,mamicode.com
首页 > 其他好文 > 详细

2017今日头条校招——或与加

时间:2018-03-21 00:11:25      阅读:433      评论:0      收藏:0      [点我收藏+]

标签:terminal   mic   esc   its   加法   tar   www   clu   coder   

传送门

Description

给定 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。

思路

题解:两个数做或运算,根据1 | 1 = 1,但 1 + 1 = 0(二进制加法),因此根据这个结论我们可以从 x + y = x | y 推得 x & y = 0,转换为求得第 k 小的 y 使得 x & y = 0,将 k 转换成为二进制,那么其二进制位为 1 的需与 x 的二进制位为 0 的位对齐。

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    long long x,k;
    cin >> x >> k;
    long long res = 0;
    long long tmp = 1;
    while (x){
        if ((!(x & 1))){
            if (k & 1){
                res |= tmp;
            }
            k >>= 1;
        }
        x >>= 1;
        tmp <<= 1;
    }
    while (k){
        if (k & 1){
            res |= tmp;
        }
        k >>= 1;
        tmp <<= 1;
    }
    cout << res << endl;
    return 0;
}

  

 

2017今日头条校招——或与加

标签:terminal   mic   esc   its   加法   tar   www   clu   coder   

原文地址:https://www.cnblogs.com/zzy19961112/p/8525519.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!