标签:xor cout long 异或 Plus ull delta mathrm
蛮有意思的一个关于二进制的题,建立在plus和xor的关系上的题,
由于 $A = X + Y, B = X \; \mathrm{xor} \; Y$,那么 $A = B + ((X \; \mathrm{and} \; Y) << 1)$。
因此 $X \; \mathrm{and} \; Y = (A - B) >> 1$,然后同时根据 $X \; \mathrm{xor} \; Y = B, X \; \mathrm{and} \; Y = (A - B) >> 1$ 这两个条件,在二进制下一位一位的去分类讨论一下 $X$ 和 $Y$ 在那以为到底是 $0$ 还是 $1$。
记 $X$ 和 $Y$ 的每一位分别是 $x$ 和 $y$,讨论:$x \; \mathrm{and} \; y = \; ?, x \; \mathrm{xor} \; y = \; ?$
① $1 \; \mathrm{and} \; 1 = 1, 1 \; \mathrm{xor} \; 1 = 0$,
② $0 \; \mathrm{and} \; 0 = 0, 0 \; \mathrm{xor} \; 0 = 0$,这俩是固定的,没得选。
③ $1 \; \mathrm{and} \; 0 = 0, 1 \; \mathrm{xor} \; 0 = 1$,
④ $0 \; \mathrm{and} \; 1 = 0, 0 \; \mathrm{xor} \; 1 = 1$,这俩显然选④,让X更小。
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); ull a, b; cin >> a >> b; if(a < b) // A will not be less than B { cout << "-1"; return 0; } ull delta = a - b; if((delta & 1) != 0) // if A-B is not even number { cout << "-1"; return 0; } ull x = 0, y = 0; delta >>= 1; // now, delta = x and y ull k = 1; // k = 1, 10, 100, 1000, ... while(true) { ull and_lp = delta & 1, xor_lp = b & 1; // get last place // cout << xor_lp << " " << and_lp << endl; if(xor_lp == 0 && and_lp == 1) x |= k, y |= k; else if(xor_lp == 0 && and_lp == 0) ; // do nothing else if(xor_lp == 1 && and_lp == 0) y |= k; else { cout << "-1"; return 0; } if(delta == 0 && b == 0) break; else delta >>= 1, b >>= 1, k <<= 1; } cout << x << " " << y; return 0; }
标签:xor,cout,long,异或,Plus,ull,delta,mathrm 来源: https://www.cnblogs.com/dilthey/p/14811628.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。