一道内存和cpu时间的题(简单而复杂)

mooncmy 2011-03-17 11:45:57
char a1,a2,a3,a4;
char b1,b2,b3,b4;
char c1,c2,c3,c4;

要实现:

将a1与b1的求和存到c1,
将a2与b2的求和存到c2,
将a3与b3的求和存到c3,
将a4与b4的求和存到c4,


请问用什么数据结构和算法,使用的cpu时间最少?使用的内存最少?
...全文
167 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluewanderer 2011-03-17
  • 打赏
  • 举报
回复
其实SIMD折腾内存的代价不比分开加小...
赵4老师 2011-03-17
  • 打赏
  • 举报
回复
搜“SIMD”
bluewanderer 2011-03-17
  • 打赏
  • 举报
回复
你想把4立方米的水灌在小于4立方米的容器中还不洒么?
mooncmy 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bokutake 的回复:]
我想的办法是用一个struct或者4元素数组,然后强制转换为unsigned int指针做加法。因为计算机内部是用的补码,只要不超出范围的话,应该是能加上的。
[/Quote]

数组肯定是不行的,你都想到了,可能会溢出
结构是数组也是一样的
mooncmy 2011-03-17
  • 打赏
  • 举报
回复
其实问题就两个
一是用什么数据结构来保存计算的结果;
二是用什么算法;
mooncmy 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chenjiawei007 的回复:]
要求很高啊,

算法决定CPU的效率,不敢多说,

内存上,

可以自己开辟数据吗?不知道5字节内存算不算多。

实现大致是这样,

char* buf = char[5];

a1+b1 --> char[0];
a2+b2 --> char[1];
a3+b3 --> char[2];
a4+b4 --> char[3];

char[4],当做算数暂放用。
……
[/Quote]

5个字节太多了,你还不如定义4个char来保存结果,
不过4个字节一般都能想到,肯定不对了
ForestDB 2011-03-17
  • 打赏
  • 举报
回复
c1 = a1 + b1;
c2 = a2 + b2;
c3 = a3 + b3;
c4 = a4 + b4;
个人觉得这样就够了,其他的事就交给编译器吧。
辰岡墨竹 2011-03-17
  • 打赏
  • 举报
回复
不过要控制符号什么的、溢出什么的,而且又保证效率,最好还是用汇编使用Pentium的MMX指令集,比如PADDSB指令能一次做64位压缩的8个有符号数的加法,还能保证符号正确。
lhy 2011-03-17
  • 打赏
  • 举报
回复
怎么写都用不了多少时间。
辰岡墨竹 2011-03-17
  • 打赏
  • 举报
回复
我想的办法是用一个struct或者4元素数组,然后强制转换为unsigned int指针做加法。因为计算机内部是用的补码,只要不超出范围的话,应该是能加上的。
chenjiawei007 2011-03-17
  • 打赏
  • 举报
回复
要求很高啊,

算法决定CPU的效率,不敢多说,

内存上,

可以自己开辟数据吗?不知道5字节内存算不算多。

实现大致是这样,

char* buf = char[5];

a1+b1 --> char[0];
a2+b2 --> char[1];
a3+b3 --> char[2];
a4+b4 --> char[3];

char[4],当做算数暂放用。


其实LZ的问题难处在于,如果内存多些,可以执行语句少,CPU时间也就少,
但是内存少了,执行语句就会多,
期间的均衡又没有标准,所以也没标准答案吧。
mooncmy 2011-03-17
  • 打赏
  • 举报
回复
当然是用c写了,都说是char了
is2120 2011-03-17
  • 打赏
  • 举报
回复
数组加循环

这需要啥算法呀,cpu处理个+加法够快了吧
bdmh 2011-03-17
  • 打赏
  • 举报
回复
直接写汇编
LinuxBirdMan 2011-03-17
  • 打赏
  • 举报
回复
用汇编吧。。。
yy198619 2011-03-17
  • 打赏
  • 举报
回复
有没有完整的程序可以参考参考啊
dooX8086 2011-03-17
  • 打赏
  • 举报
回复
4个char 的内存顺序排列方式..可当作 int
因为是 char 不是 unsigned char 所不用考虑进位情况.
*(unsigned int *)&c4 =*(unsigned int *)&b4 + *(unsigned int *)&a4;

// 不过要保证 char 的赋值 -128~127
xali 2011-03-17
  • 打赏
  • 举报
回复
抱歉!最后应该 *c=*a+*b;
xali 2011-03-17
  • 打赏
  • 举报
回复
最好想个办法让4个char类型的值看成一个32位整型值,一次加法完成,不过这里不能有进位的情况。
能不能 int* a=&a1,b=&b1,c=&c1; c=a+b; //完成?
masmaster 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 forestdb 的回复:]
c1 = a1 + b1;
c2 = a2 + b2;
c3 = a3 + b3;
c4 = a4 + b4;
个人觉得这样就够了,其他的事就交给编译器吧。
[/Quote]
两个加数过大怎么办?
加载更多回复(3)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧