室友弄個題目來給我做,好像說是以前微軟的筆試題。
開始覺得蠻扯蛋的,誰無聊寫這種東西.不過想一想倒還是考不少基本功的.
分析一下題目,應該是模擬計算機組成原理上學的硬件的加法器來實現.從最低位到最高位,依次計算每一位的運算結果及進位,從而得到最終結果
考查了計算機組成原理的知識,考查了位操作.符號位的處理需要理解補碼表示,我都快忘光了,呵呵.
#include <stdio.h>
#include <stdlib.h>
int add(int a,int b)
{
int i,c;
int ret = 0;
int jinwei = 0;
int tmp1,tmp2;
int mask = 0;
for(i=0; i<32; i++)
{
c = 0;
mask = (1<<i);
tmp1 = a&mask; //tmp1是取出第一個數的第i位
tmp2 = b&mask; //tmp2是取出第二個數的第i位
if(tmp1)
c++;
if(tmp2)
c++;
if(jinwei)
c++;
switch(c) //考查 第一個數i位,第二個數i位,進位 共出現多少個1,以決定當前位結果和進位
{
case 0:
break;
case 1:
ret |= mask;
jinwei = 0;
break;
case 2:
jinwei = mask<<1;
break;
case 3:
jinwei = mask<<1;
ret |= mask;
break;
default:
exit(-1);
}
}
return ret | jinwei;
}
int main()
{
int a,b;
a = 18;
b = -3;
printf("%d",add(a,b));
return 0;
}
計算機組成原理中,減法是轉換成補碼了做加法.而補碼表示的符號位直接參與運算,所以上面是for(i=0; i<32...)
瞎搞的,不知道++運算符算不算犯規,也不知道標准答案是怎么解的