腾讯云 wordpress建站,注册公司银行开户需要多少钱,商业网站规划,成都网站平面设计前言 #xff08;1#xff09;刷B站看到一个面试题#xff0c;不用加减乘除计算两数之和。 #xff08;2#xff09;当时我看到这个题目#xff0c;第一反应就是感觉这是一个数电题目。不过需要采用C语言的方式编写出来。 #xff08;3#xff09;不过看到大佬的代码之…前言 1刷B站看到一个面试题不用加减乘除计算两数之和。 2当时我看到这个题目第一反应就是感觉这是一个数电题目。不过需要采用C语言的方式编写出来。 3不过看到大佬的代码之后感觉自己的思想还是太局限了。 利用数电知识解题 1当时我看到这个题目第一想法就是画出逻辑电路图分析过程我就不赘述了。感兴趣的可以看【硬件科普】带你认识CPU第02期——CPU是怎么计算加法的上这个视频讲解 2根据上图于是我们可以知道需要一个当前值a和b一个输入的进位值carry_bit。最终输出数据S和进位符号carry_bit。 注意carry_bit是进位符号所以他每次计算的时候需要左移1位否则他就是在上一位最终输出的是一个错误数据。 #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_bit0,ret0;for(i0 ; i16 ; i){ret | get_bit(a,i) ^ get_bit(b,i) ^ (carry_bit1); //计算本位值carry_bit AND(a,b,i) | AND(a,carry_bit,i) | (get_bit(b,i) (carry_bit1)); //计算进位值}return ret;
}将上面代码精简 1这个是一个大佬的思路与我们上面一样建立一个本位和一个进位。不过这一次与上一次不一样的点在于上一次每次都是一位一位的进行操作。而大佬是直接将本位的值利用异或运算一次性计算出来进位值利用与运算保留。 2得到进位值之和将进位制左移一位再与上一次的本位进行异或运算得到进位制。循环往复最终直到进位制消失。 int ADD(int x,int y)
{while(y ! 0) //直到进位值消失{int tmp x^y; //异或计算出本位y (xy)1; //与计算出进位x tmp;}
}