LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1791|回复: 9

如何用C语言实现加法进位等标志?

[复制链接]
发表于 2005-12-8 21:50:25 | 显示全部楼层 |阅读模式
想用C语言实现一个两个8位补码相加的函数,返回一个8位补码的结果和标志;
包括这样一些标志:进位标志,低半字节向高半字节的进位标志,溢出标志,奇偶校验标志(结果中有奇数个1则该标志为1)。

怎样实现好一点呢?谢谢大虾指导了。
发表于 2005-12-8 22:06:20 | 显示全部楼层
我想只能嵌入汇编了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-8 22:15:11 | 显示全部楼层
我还不会嵌入汇编,怎么做呢?

嵌入汇编会不会影响可移植性呢?
回复 支持 反对

使用道具 举报

发表于 2005-12-8 22:26:31 | 显示全部楼层
C99有bool类型了吧?弄个bool数组?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-8 23:18:36 | 显示全部楼层
Post by manphiz
C99有bool类型了吧?弄个bool数组?

问题不是怎么保存这些结果,而是如何得到这些标志。
回复 支持 反对

使用道具 举报

发表于 2005-12-9 09:09:58 | 显示全部楼层
0 无进位
1 有进位
在进行与或移位操作就行了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-9 12:59:23 | 显示全部楼层

  1. unsigned char a,b;
  2. a = 0x12, b = 0x89;
  3. //cy:进位标志
  4. //ov:溢出标志
  5. //ac:辅助进位标志
  6. //p:奇偶校验标志
  7. unsigned char cy,ac,ov,p;   

  8. cy = unsigned char( unsigned short(a)  + b  / 256 );
  9. ac = ( ((a & 0x0f) + (b & 0x0f))  & 0x10 ) >> 4;
  10. signed int tmp = (signed int(a) + signed int(b));
  11. if(  (tmp > 128) || (tmp < -127) )
  12.     ov = 1;
  13. else
  14.     ov = 0;
  15. a += b;
复制代码

这是我写的,感觉这样效率很低,有没有高效一点的,还有奇偶校验不知道该怎么写。
回复 支持 反对

使用道具 举报

发表于 2005-12-9 14:11:37 | 显示全部楼层
楼主写这个函数的目的是什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-9 17:17:53 | 显示全部楼层
想通过写点什么来学习程序设计,Linux下面好像还没有C51单片机的模拟器,决定自己写一个试试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-10 00:27:14 | 显示全部楼层
学到一个写奇偶检验的方法了,请指教:

  1. int count_bits(unsigned char x)
  2. {
  3. x = (x&0x55)+((x>>1)&0x55);
  4. x = (x&0x33)+((x>>2)&0x33);
  5. x = (x+(x>>4))&0x0f;
  6. return x;
  7. }

  8. bool get_p(unsigned char y)
  9. {
  10.      int x = count_bits(y);
  11.      return(x%2);
  12. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表