C言語関係掲示板

過去ログ

No.461.大きなサイズのメモリコピー

[戻る] [ホームページ]
No.3316

大きなサイズのメモリコピー
投稿者---めも(2002/11/03 22:46:05)


メモリコピーについて質問がありますので、なにか参考になる
ことなどありましたら、よろしくお願いします。
大きなサイズ(数十MBくらい)のデータを確保したメモリに
コピーしてあり、そのメモリ内容をバイト単位で最後のデータから逆順に
作り直したいとき、どのような方法が良いのでしょうか。
同じサイズのメモリを確保して、元のデータの最後のデータから
コピーしなおせば済みそうですが、何かほかに方法はないでしょうか。
それから、ビット単位で逆順にしたい場合、1ビットずつシフトさせて
バイトを構成しなおしてからコピーする方法を考えているのですが、
どうでしょうか。

No.3319

Re:大きなサイズのメモリコピー
投稿者---かずま(2002/11/04 01:43:16)


> それから、ビット単位で逆順にしたい場合、1ビットずつシフトさせて
> バイトを構成しなおしてからコピーする方法を考えているのですが、
> どうでしょうか。

表を使えば、速くなります。
#include <stdio.h>

#define N  8  /* 本当は、数十メガ */

unsigned char a[N] = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 };
unsigned char b[N];

#define t0(x) t1(x),t1(x+1)
#define t1(x) t2(x),t2(x+2)
#define t2(x) t3(x),t3(x+4)
#define t3(x) t4(x),t4(x+8)
#define t4(x) t5(x),t5(x+16)
#define t5(x) t6(x),t6(x+32)
#define t6(x) t7(x),t7(x+64)
#define t7(x) x,x+128

unsigned char tab[] = { t0(0) };

int main()
{
    int i = N;
    unsigned char *s = a+N, *t = b;

    while (i--) *t++ = tab[*--s];

    for (i = 0; i < N; i++)
        printf(" %02x", b[i]);
    puts("");
    return 0;
}


No.3324

Re:大きなサイズのメモリコピー
投稿者---めも(2002/11/04 19:41:12)



>表を使えば、速くなります。

こんな方法もあるのですか。
勉強になりました。
ありがとうございます。