小米面试题——不用加减乘除计算两数之和

前言

(1)刷B站看到一个面试题,不用加减乘除计算两数之和。

(2)当时我看到这个题目,第一反应就是感觉这是一个数电题目。不过需要采用C语言的方式编写出来。

(3)不过看到大佬的代码之后,感觉自己的思想还是太局限了。

利用数电知识解题

(1)当时我看到这个题目,第一想法就是画出逻辑电路图,分析过程我就不赘述了。感兴趣的可以看【硬件科普】带你认识CPU第02期------CPU是怎么计算加法的(上)这个视频讲解

(2)根据上图,于是我们可以知道,需要一个当前值a和b,一个输入的进位值carry_bit。最终输出数据S和进位符号carry_bit。

注意:carry_bit是进位符号,所以他每次计算的时候,需要左移1位,否则他就是在上一位,最终输出的是一个错误数据。

c 复制代码
#define get_bit(data,bit)  (data & (0x01 << bit))
#define AND(a,b,i)   (get_bit(a,i) & get_bit(b,i))
int ADD(int a,int b)
{
	int i,carry_bit=0,ret=0;
	for(i=0 ; i<16 ; i++)
	{
		ret |= get_bit(a,i) ^ get_bit(b,i) ^ (carry_bit<<1); //计算本位值
		carry_bit = AND(a,b,i) | AND(a,carry_bit,i) | (get_bit(b,i) & (carry_bit<<1)); //计算进位值
	}
	return ret;
}

将上面代码精简

(1)这个是一个大佬的思路,与我们上面一样,建立一个本位和一个进位。不过这一次与上一次不一样的点在于,上一次每次都是一位一位的进行操作。而大佬是直接将本位的值利用异或运算一次性计算出来,进位值利用与运算保留。

(2)得到进位值之和,将进位制左移一位,再与上一次的本位进行异或运算,得到进位制。循环往复,最终直到进位制消失。

c 复制代码
int ADD(int x,int y)
{
	while(y != 0)  //直到进位值消失
	{
		int tmp = x^y; //异或,计算出本位
		y = (x&y)<<1;  //与,计算出进位
		x = tmp;
	}
}
相关推荐
我是陈泽3 分钟前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
优雅的小武先生13 分钟前
QT中的按钮控件和comboBox控件和spinBox控件无法点击的bug
开发语言·qt·bug
戊子仲秋17 分钟前
【LeetCode】每日一题 2024_10_2 准时到达的列车最小时速(二分答案)
算法·leetcode·职场和发展
邓校长的编程课堂19 分钟前
助力信息学奥赛-VisuAlgo:提升编程与算法学习的可视化工具
学习·算法
虽千万人 吾往矣20 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
创作小达人22 分钟前
家政服务|基于springBoot的家政服务平台设计与实现(附项目源码+论文+数据库)
开发语言·python
郭二哈25 分钟前
C++——list
开发语言·c++·list
杨荧26 分钟前
【JAVA开源】基于Vue和SpringBoot的洗衣店订单管理系统
java·开发语言·vue.js·spring boot·spring cloud·开源
ZPC821032 分钟前
Python使用matplotlib绘制图形大全(曲线图、条形图、饼图等)
开发语言·python·matplotlib
missmisslulu34 分钟前
电容笔值得买吗?2024精选盘点推荐五大惊艳平替电容笔!
学习·ios·电脑·平板