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的二進位制...