题意:给出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;
}