给定两个正整数,在没有 + 运算符的情况下返回它们的和
Posted 小陈乱敲代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定两个正整数,在没有 + 运算符的情况下返回它们的和相关的知识,希望对你有一定的参考价值。
问题陈述很简单。给定两个正整数,在没有 + 运算符的情况下返回它们的和。
输入:5、6
输出:11
#include <stdint.h>
uint32_t Add(uint32_t x, uint32_t y)
uint32_t sum = 0;
//Implement logic
return sum;
这个问题的实际意图是您是否可以使用逻辑门实现 Add 功能。让我们考虑一下半加器的真值表。
- 半加器真值表
从真值表中,您可以找到进位 = x & y和sum = x ^ y。但是,我们不能在 & 之后使用进位。为了处理进位结果,它应该向左移动 1 并与下一个输入位迭代相加。此迭代将继续进行,直到新进位为零。因此,进位公式为(x & y) << 1
-
算法示例
-
实施和测试
- 创建 half_adder ceedling 项目
ceedling module:create[half_adder]
- half_adder.h
#ifndef HALF_ADDER_H
#define HALF_ADDER_H
#include <stdint.h>
uint32_t Add(uint32_t x, uint32_t y);
#endif // HALF_ADDER_H
- half_adder.c
#include "half_adder.h"
uint32_t Add(uint32_t x, uint32_t y)
uint32_t sum;
uint32_t carry;
do
sum = x ^ y;
carry = (x & y) << 1;
x = sum;
y = carry;
while (carry != 0);
return sum;
- test_half_adder.c
#include "unity.h"
#include "half_adder.h"
void setUp(void)
void tearDown(void)
void test_half_adder_input5and6(void)
uint32_t x = 5;
uint32_t y = 6;
TEST_ASSERT_EQUAL(x+y, Add(x,y));
- 运行测试和结果
ceedling test:half_adder
- 样本测试用例还不够?
是的,这还不够,因为有 4 个案例的进位 = 0,另外 4 个案例的进位 = 1。示例输入 5 和 6 不会涵盖所有这 8 个案例。为了证明该算法,您需要至少涵盖所有 8 种情况。我能够导出两个输入来涵盖如下所示的所有 8 个案例:
在 test_half_adder.c 中添加测试用例并重新测试
void test_half_adder_input428and362(void)
uint32_t x = 428;
uint32_t y = 362;
TEST_ASSERT_EQUAL(x+y, Add(x,y));
以上是关于给定两个正整数,在没有 + 运算符的情况下返回它们的和的主要内容,如果未能解决你的问题,请参考以下文章
环形链表(哈希表链表)寻找两个正序数组的中位数(数组二分查找)二进制求和(位运算数学)
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。