1. 程式人生 > 實用技巧 >位元組跳動2017客戶端工程師實習生筆試題-第四題

位元組跳動2017客戶端工程師實習生筆試題-第四題

時間限制:C/C++ 1秒,其他語言2秒

空間限制:C/C++ 32M,其他語言64M

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

example:

input: 5 1

output: 2

 1 /*學自csdn題解*/
 2 #include<iostream>
 3
#include<cstdio> 4 using namespace std; 5 6 long long theNum(int x, int k) 7 { 8 long long tmp = x; 9 long long index1 = 1; 10 long long index2 = 1; 11 //當index2小於等於k時,進入迴圈 12 while (index2 <= k) 13 { 14 //(index1 & tmp)== 0 代表找到tmp二進位制中為0的一位; 15 //
若 y與 x的二進位制位互反,即(index1 & tmp)== 0,則x+y==x|y; 16 if ((index1 & tmp) == 0) 17 { 18 //設x的二進位制在第i位為0 ,則y二進位制的第i位就有0、1兩種取法,故index2<<=1; 19 if (index2 & k) 20 { 21 //如果k對應的位是1,則tmp 更新為tmp = tmp | index1。why? 22 //因為,index2 & k 意味著在此處k%2==1,則要把index1加給tmp;
23 tmp = tmp | index1; 24 } 25 index2 <<= 1;//index2向左移動一位 26 } 27 //index1向左移動一位 28 index1 <<= 1; 29 } 30 return (tmp - x); 31 } 32 33 int main(void) 34 { 35 int x, k; 36 while (cin >> x >> k) 37 { 38 cout << theNum(x, k) << endl; 39 } 40 return 0; 41 }