加法与异或

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

题目链接: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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值