給定 x1..x8 與未知 m 異或後的值 r1..r8,以及 sum(x1..x8) XOR m 的值 r9。求 m。
m 為 32 位整數。從最低位(bit 0)到最高位(bit 31)依次確定:
m 的第 i 位為 0/1,計算所有 xi 的第 i 位((ri >> i) & 1,因 ri = xi XOR m)。tmp,加上低位進位 carry,總和模 2 應等於 r9 第 i 位。(carry + tmp) % 2 == (r9 >> i) & 1,則 m 第 i 位為 0;否則為 1(置位)。carry = (carry + tmp) / 2 供下一位使用。
int main() {
int T; cin >> T;
while (T--) {
int r[10];
for (int i=1; i<=9; i++) cin >> r[i];
int m = 0, carry = 0;
for (int i=0; i<32; i++) {
int tmp = 0;
for (int j=1; j<=8; j++) tmp += (r[j]>>i)&1;
if ((carry + tmp) % 2 != ((r[9]>>i)&1)) {
m |= (1<
異或按位獨立,但加法有進位。利用已知 sum(xi) XOR m = r9,即 sum(xi) = r9 XOR m。左邊為 8 個數之和,右邊為已知值異或未知 m。從低位推導 m 每一位,進位傳遞到高位,唯一確定。