我是天才
伟大的野心家,实践家; 程序员,技术问题解决者.

导航

 

室友弄个题目来给我做,好像说是以前微软的笔试题。

开始觉得蛮扯蛋的,谁无聊写这种东西.不过想一想倒还是考不少基本功的.

分析一下题目,应该是模拟计算机组成原理上学的硬件的加法器来实现.从最低位到最高位,依次计算每一位的运算结果及进位,从而得到最终结果

考查了计算机组成原理的知识,考查了位操作.符号位的处理需要理解补码表示,我都快忘光了,呵呵.

#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...)

瞎搞的,不知道++运算符算不算犯规,也不知道标准答案是怎么解的

posted on 2012-03-05 12:56  Genius0101  阅读(2044)  评论(5编辑  收藏  举报