【刷题】不用加减乘除做加法
创始人
2024-05-20 11:38:07
0

        这是一道简单的数学题。但是比较繁琐,需要有耐心。

目录

前言

一、找规律

二、怎么实现加法?

 总结


前言

        这道题不让用四则运算符做加法,于是我第一反应是用位运算。

        难道转成二进制再使用位运算吗,显然不需要,列草稿可以观察到一部分规律。


一、找规律

         列出5+7的二进制竖式,可以得知:

        两数相加分为本位和与进位和,本位和是按位异或的结果,进位和是按位与的结果,进位需要进在上一位,所以需要左移

二、怎么实现加法?

        将本位和与进位(左移一位后的)进行按位异或,这样可以得到两个数字本位和与进位的无进位之和,接着本位和与进位进行按位异或和按位与分别求出他们的本位和与无进位和。

举个例子:

        现有两数a = 5, b = 7:a = 0101, b = 0111,

        a ^ b = 0010得到 a 与 b 的无进位之和 sum = 0010;

        a & b = 0101得到 a 与 b 的进位,左移一位后得到真正的进位add = 1010;

        sum ^ add = 1000得到第一次进位后的无进位和,保存在 a 中,此时a = 1000; 

        sum & add = 0010得到第一次进位后的进位,左移后保存在 b 中,此时b = 0100;


        由进位0100可知现在仍有进位没有被进上去,重复上述过程:

        a ^ b = 1100得到 a 与 b 的无进位之和 sum = 1100;

        a & b = 0000得到 a 与 b 的进位,此时说明进位以进完, add = 0000;

        sum ^ add = 1100得到第二次进位后的无进位和,保存在 a 中,此时a = 1100;

        进位为0,结束循环,返回 a 为和。


代码如下(示例):

#include int main()
{int num1 = 53;int num2 = 17;while (num2 != 0){// 无进位和int sum = num1 ^ num2;// 进位int add = (num1 & num2) << 1;num1 = sum ^ add;num2 = (sum & add) << 1;}printf("%d", num1);return 0;
}

 总结

        进行位运算是一项细心的活,需要我时刻保持清醒的大脑去进行运算,像小学一年级那样,一步一步,不能有任何疏忽和马虎,在编程这件事上,我也正好是一年级。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...