C言語関係掲示板

過去ログ

No.356.Unionを使用しての入れ替え

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

Unionを使用しての入れ替え
投稿者---ひろお(2002/08/05 22:58:47)


Unionを使用して、16ビットのデータを上下8ビット入れ替える関数
をプログラムしたいのですが、どのようにプログラムしていいか
わかりません。教えてください。

No.2317

Re:Unionを使用しての入れ替え
投稿者---ともじ(2002/08/06 10:53:15)


こんにちは。

>Unionを使用して、16ビットのデータを上下8ビット入れ替える関数
>をプログラムしたいのですが、どのようにプログラムしていいか
>わかりません。教えてください。

このような感じでどうでしょう。

#include <stdio.h>

typedef union {
    unsigned char c[2];
    unsigned short n;
} W_16;

void swap_w16( unsigned short *x );

int main(void)
{
        unsigned short x = 0x55aa;

        printf("%hx\n", x);
        swap_w16(&x);
        printf("%hx\n", x);
      
        return (0);
}

void swap_w16( unsigned short *x )
{
        unsigned char w;
      
        w = ((W_16 *)x)->c[1];
        ((W_16 *)x)->c[1] = ((W_16 *)x)->c[0] ;
        ((W_16 *)x)->c[0] = w;
}



No.2318

Re:Unionを使用しての入れ替え
投稿者---かずま(2002/08/06 17:08:51)


> void swap_w16( unsigned short *x )
> {
>     unsigned char w;
>     
>     w = ((W_16 *)x)->c[1];
>     ((W_16 *)x)->c[1] = ((W_16 *)x)->c[0] ;
>     ((W_16 *)x)->c[0] = w;
> }


私はこの解に不満があります。union のメンバー n が使われていません。
unsigned short へのポインタを W_16 へのポインタにキャストすることで、
*x を n に重ね合わせていると強弁することもできますが、キャストを使う
のなら、次のように書けば済みます。

void swap_w16(unsigned short *x)
{
    unsigned char w, *p;

    p = (unsigned char *)x;
    w = p[1];
    p[1] = p[0];
    p[0] = w;
}

キャストを使わず union だけを使うとすれば、

void swap_w16(unsigned short *x)
{
    W_16 w1, w2;

    w1.n = *x;
    w2.c[0] = w1.c[1];
    w2.c[1] = w1.c[0];
    *x = w2.n;
}


No.2320

Re:Unionを使用しての入れ替え
投稿者---ともじ(2002/08/06 18:45:01)


void swap_w16(unsigned short *x)
{
    W_16 w1, w2;

    w1.n = *x;
    w2.c[0] = w1.c[1];
    w2.c[1] = w1.c[0];
    *x = w2.n;
}


こちらの方が適切ですね。

No.2321

Re:Unionを使用しての入れ替え
投稿者---ともじ(2002/08/06 19:00:52)


思い出しました。
最初は
unsigned short swap_w16(unsigned short x)
{
    W_16 w;
    w.c[0] = ((W_16 *)&x)->c[1];
    w.c[1] = ((W_16 *)&x)->c[0];
    return (w.n);
}

としていて、途中から引数をポインタに代えてnがなくなって
しまったのです。


No.2326

Re:Unionを使用しての入れ替え
投稿者---ひろお(2002/08/07 01:25:12)


ともじさん、かずまさん、ありがとうございます。
教えていただいたプログラムでコンパイルしてみます。
また、不明点があったら質問するかも知れませんが
そのときは、よろしくお願いします。