题意:给出x1,x2,x3,x4,x5,x6,x7,x8与某值m进行异或运算后的结果,再给出x1~x8之和与m进行异或运算后的结果sum,求m.
思路:
根据位运算特性来做,由于m最大为32位,我们可以从最低位依次来推理得到,用x>>i&1来取右数第i-1位的值。
假设二进制右起第一位是1,算出所有xi的右起第一位二进制结果,累加得到tmp,比较tmp与sum的最右位,符合则m最右位为1,否则为0;
于是x1~x8的二进制最右位已求出,累加求进位依次类推。
很有意思的一道题~
code:
/* *Author : Flint_x *Created Time : 2015-07-20 14:19:04 *File name : whust1_I.cpp */ #include<iostream> #include<sstream> #include<fstream> #include<vector> #include<list> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<bitset> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<cctype> #include<cmath> #include<ctime> #include<iomanip> using namespace std; const double eps(1e-8); typedef long long lint; #define cls(a) memset(a,0,sizeof(a)) #define rise(i,a,b) for(int i = a ; i <= b ; i++) #define fall(i,a,b) for(int i = a ; i >= b ; i--) int main(){ // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); int T; cin >> T; rise(t,1,T){ int r[10]; rise(i,1,9) cin >> r[i]; int sum = 0, m = 0; rise(i,0,31){ int tmp = 0; rise(j,1,8){ tmp += r[j]>>i&1; } if((sum + tmp)% 2 != (r[9]>>i&1)){//x>>i&1等效于1<<i&x tmp = 8 - tmp; sum = (sum + tmp) / 2; m += 1<<i; } else sum = (sum + tmp) / 2; } cout << m << endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/qq_15714857/article/details/46972373