前言
(1)如果有嵌入式企業(yè)需要招聘校園大使,湖南區(qū)域的日常實(shí)習(xí),任何區(qū)域的暑假Linux驅(qū)動(dòng)實(shí)習(xí)崗位,可C站直接私聊,或者郵件:zhangyixu02@gmail.com,此消息至2025年1月1日前均有效
(2)刷B站看到一個(gè)面試題,不用加減乘除計(jì)算兩數(shù)之和。
(3)當(dāng)時(shí)我看到這個(gè)題目,第一反應(yīng)就是感覺這是一個(gè)數(shù)電題目。不過需要采用C語言的方式編寫出來。
(4)不過看到大佬的代碼之后,感覺自己的思想還是太局限了。
利用數(shù)電知識(shí)解題
(1)當(dāng)時(shí)我看到這個(gè)題目,第一想法就是畫出邏輯電路圖,分析過程我就不贅述了。感興趣的可以看【硬件科普】帶你認(rèn)識(shí)CPU第02期——CPU是怎么計(jì)算加法的(上)這個(gè)視頻講解
(2)根據(jù)上圖,于是我們可以知道,需要一個(gè)當(dāng)前值a和b,一個(gè)輸入的進(jìn)位值carry_bit。最終輸出數(shù)據(jù)S和進(jìn)位符號(hào)carry_bit。
注意:carry_bit是進(jìn)位符號(hào),所以他每次計(jì)算的時(shí)候,需要左移1位,否則他就是在上一位,最終輸出的是一個(gè)錯(cuò)誤數(shù)據(jù)。
#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); //計(jì)算本位值
carry_bit = AND(a,b,i) | AND(a,carry_bit,i) | (get_bit(b,i) & (carry_bit<<1)); //計(jì)算進(jìn)位值
}
return ret;
}
將上面代碼精簡
(1)這個(gè)是一個(gè)大佬的思路,與我們上面一樣,建立一個(gè)本位和一個(gè)進(jìn)位。不過這一次與上一次不一樣的點(diǎn)在于,上一次每次都是一位一位的進(jìn)行操作。而大佬是直接將本位的值利用異或運(yùn)算一次性計(jì)算出來,進(jìn)位值利用與運(yùn)算保留。
(2)得到進(jìn)位值之和,將進(jìn)位制左移一位,再與上一次的本位進(jìn)行異或運(yùn)算,得到進(jìn)位制。循環(huán)往復(fù),最終直到進(jìn)位制消失。文章來源:http://www.zghlxwxcb.cn/news/detail-686424.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-686424.html
int ADD(int x,int y)
{
while(y != 0) //直到進(jìn)位值消失
{
int tmp = x^y; //異或,計(jì)算出本位
y = (x&y)<<1; //與,計(jì)算出進(jìn)位
x = tmp;
}
return x;
}
到了這里,關(guān)于小米面試題——不用加減乘除計(jì)算兩數(shù)之和的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!