给定两个正整数,在没有 + 运算符的情况下返回它们的和

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

  • 算法示例

  • 实施和测试

  1. 创建 half_adder ceedling 项目
ceedling module:create[half_adder]
  1. 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
  1. 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;

  1. 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));

  1. 运行测试和结果
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,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

移位运算符的使用

OJ随笔——1102-海明距离——位运算

一道笔试题-给定一个正整数序列,请尝试将它们重新排列使得排列的结果最大。

在没有它们的情况下解析协议缓冲区数据