高分求快速算法。

zgz 2002-06-25 03:50:06
请教一个快速算法,题目如下:

已知有一块缓冲区A,现在要求把缓冲区A中的数据每一个字节的低四位取出,
然后再合并成一个新的缓冲区B。
缓冲区A的大小为1M,那么缓冲区B的大小为512k。

例子:
缓冲区A中的数据:0x12,0x34,0x56,0x78,0x9a,0xbc...
转换后,缓冲区B中的数据:0x42,0x86,0xca,...

请给出数据转换的快速算法。


...全文
46 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgz 2002-06-26
  • 打赏
  • 举报
回复
或者:
for(i = 0; i < x/2; i++){
*pB++ = table[*pA++];
}

可以替换成:

char *pB_end = pB + x/2;
while(pB != pB_end){
*pB++ = table[*pA++];
}

to cyAnalyst(cc) : 用汇编写会更快么?c的效率已经很高了!

zgz 2002-06-26
  • 打赏
  • 举报
回复
受one_and_one启发,这个算法大家觉得如何?


char table[256*256];
int i;
for(i = 0; i < 256*256; i++){
table[i] = (i & 0x0f) | ((i & 0x0f00) >> 4);
}

short int *pA = (short int *)缓冲区a;
char *pB = (char *)缓冲区b
int x = 缓冲区a的长度;

for(i = 0; i < x/2; i++){
*pB++ = table[*pA++];
}
cyAnalyst 2002-06-26
  • 打赏
  • 举报
回复
如果真的需要,可以使用汇编。那是提高效率的最好方法。
one_add_one 2002-06-26
  • 打赏
  • 举报
回复
char *pB_end = pB + x>>1;
while(pB != pB_end){
*pB++ = table[*pA++];
}
要好些
one_add_one 2002-06-26
  • 打赏
  • 举报
回复
不错,不错。

如果你不嫌麻烦,用汇编也可以。
zgz 2002-06-25
  • 打赏
  • 举报
回复
to penu:
我这个缓冲区转换用在液晶驱动程序上,因此需要快速算法以获得更好的显示性能。
我的液晶显示器只有16级灰度(用四个bit代表一个点),而上层图形软件的绘图缓冲区是基于256级灰度(一个字节代表一个点),而cpu比较慢(30MHZ)为了更快地显示需要快速算法。

one_add_one的算法有点意思,用两次间接寻址替代了两次与、一次加和一次移位运算! Xcoder(流浪狗) 也不错。。。

还有没有更好的呀。。。?
Xcoder 2002-06-25
  • 打赏
  • 举报
回复
觉得one_and_one的那个以空间换时间的算法是很巧妙。
不过在这个问题上,因为每一步的操作并不复杂,而多重的寻址也是要花不少时间的,还是用我那个比较好。重新修改一下:
char* pa=A;
char* pb=B;
char* pend=pa+1024*1024;

for(;pa<pend;pa++,pb++){
*pb=(*pa & 0x0f) | (*(++pa) & 0x0f )<<4;
}
heiseloveyou 2002-06-25
  • 打赏
  • 举报
回复
思考中…………
penu 2002-06-25
  • 打赏
  • 举报
回复
这需要快速算法??想不通。。
penu 2002-06-25
  • 打赏
  • 举报
回复
这需要快速算法吗??想不通
one_add_one 2002-06-25
  • 打赏
  • 举报
回复
如果A非常大,那就只有用空间换时间。


main(){
int a[6]={0x12,0x34,0x56,0x78,0x9a,0xbc};
int b[3];
int t[256][256];
int i,j;
for (i=0;i<256;i++)
for (j=0;j<256;j++)
t[i][j]=((i & 0xf)<< 4) | (j & 0xf);

for (i=0;i<6;i+=2)
b[i>>1]=t[a[i+1]][a[i]];

}
one_add_one 2002-06-25
  • 打赏
  • 举报
回复
main(){
int a[6]={0x12,0x34,0x56,0x78,0x9a,0xbc};
int b[3];
int i;
for (i=0;i<6;i+=2)
b[i>>2]=((a[i+1] & 0xf)<< 4) + (a[i] & 0xf);
}
one_add_one 2002-06-25
  • 打赏
  • 举报
回复
main(){
int a[6]={0x12,0x34,0x56,0x78,0x9a,0xbc};
int b[3];
int i;
for (i=0;i<6;i+=2)
b[i>>2]=((a[i+1] & 0xf)<< 4) + (a[i] & 0xf);
}
lonk 2002-06-25
  • 打赏
  • 举报
回复
每次从A中读两个字节a,b,
生成新的c=(a<<4) | ((b<<4)>>4)....不过好象算不上什么快速酸法呵呵
Xcoder 2002-06-25
  • 打赏
  • 举报
回复
一个笔误,循环中应是:
*pb=(*pa & 0x0f) | ((*(++pa) & 0x0f )<<4);
Xcoder 2002-06-25
  • 打赏
  • 举报
回复
char* pa=A;
char* pb=B;
char* pend=pa+1024*1024;

for(;pa<pend;pa++){
*pb=(*pa & 0x0f) | (**(++pa) & 0x0f )<<4;
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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