加法與異或

2021-06-20 07:26:46 字數 1095 閱讀 5545

desctiption

設有兩個數x和y,a為兩個數之和,b為兩個數異或的結果。現給定a和b,求對應的x和y。

input

輸入包括多組資料,每組資料報括一行,每行有2個整數a和b(其中0 ≤ a, b ≤ 2^64 - 1)。

output

每組資料輸出一行,每行2個整數代表x和y,其中x為x和y之間的較小者,若不存在輸出-1。

sample input

142 76

sample output

33 109

本題值得注意的是,unsigned long long 的移位運算,最初定義的兩個巨集如下:

#define get_bit(x, index)    (((x) >> (index)) & 0x0000000000000001)

#define set_bit(x, index, v) (((v) << (index)) | (x))

用於獲取和設定unsigned long long 資料的某一位,但是提交之後wa了。

由於我是這麼使用的set_bit(x, index - 1, 1),除錯時發現當index >= 32時設定的位不對。

回家的路上仔細想了想確實是不對,編譯器缺省會將1當做32位整型,當index >= 32時移位運算肯定就不對了,最後重寫了這兩個巨集,最終版本**如下:

#include #define get_bit(x, index)    (((x) >> (index)) & ((unsigned long long) 1))

#define set_bit(x, index, v) ((((unsigned long long) (v)) << (index)) | (x))

int main(void)

if (n == 0)

else

}else

else}}

m = c;

n = d;

++index;

} if (flag == 0)

}return 0;

}

與 或 異或運算

與 或 異或運算 1.與運算 參加運算的兩個資料,按二進位制位進行 與 運算。運算規則 0 0 0 0 1 0 1 0 0 1 1 1 即 兩位同時為 1 結果才為 1 否則為0 例如 3 5 即 0000 0011 0000 0101 0000 0001 因此,3 5的值得1。例如 9 5 即 0...

與 或 異或運算

參加運算的兩個資料,按二進位制位進行 與 運算。運算規則 0 0 0 0 1 0 1 0 0 1 1 1 即 兩位同時為 1 結果才為 1 否則為0 例如 3 5 即 0000 0011 0000 0101 0000 0001 因此,3 5的值得1。例如 9 5 即 0000 1001 9的二進位制...

與 或 異或運算

參加運算的兩個資料,按二進位制位進行 與 運算。運算規則 0 0 0 0 1 0 1 0 0 1 1 1 即 兩位同時為 1 結果才為 1 否則為0 例如 3 5 即 0000 0011 0000 0101 0000 0001 因此,3 5的值得1。例如 9 5 即 0000 1001 9的二進位制...