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
SAMPLE OUTPUT
142 76
33 109
题目链接:http://edu.freefcw.com/problem/show/1596
本题值得注意的是,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 <stdio.h>
#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)
{
int index, c, d, m, n, carry, flag;
unsigned long long a, b, x, y;
while (scanf("%llu %llu", &a, &b) != EOF)
{
index = carry = flag = 0;
x = y = 0ULL;
while (index <= sizeof(unsigned long long) * 8)
{
c = index < sizeof(unsigned long long) * 8 ? get_bit(a, index) : 0;
d = index < sizeof(unsigned long long) * 8 ? get_bit(b, index) : 0;
if (index > 0)
{
if ((carry == 0 && m != n) || (carry == 1 && m == n))
{
flag = 1;
printf("-1\n");
break;
}
if (n == 0)
{
if (c != d)
{
x = set_bit(x, index - 1, 1);
y = set_bit(y, index - 1, 1);
carry = 1;
}
else
{
carry = 0;
}
}
else
{
y = set_bit(y, index - 1, 1);
if (m == 0)
{
carry = 1;
}
else
{
carry = 0;
}
}
}
m = c;
n = d;
++index;
}
if (flag == 0)
{
printf("%llu %llu\n", x, y);
}
}
return 0;
}