[H8-ML(2730)] Re: $B"#2r7h(B $B"##8(Bbit$B%G!<%?$N#M#S#B$H#L#S#B$r5UE>$5$;$k$K$O!)(B
From: serow@xxxxxxxxxxxxxxxxxx (TANAKA Yoshitomo)
Date: 2003年01月20日(月)17時18分15秒
急に思い出しながら書いてますので間違ってたらご容赦を

unsigned char
byterev(unsigned char ibyte)
{
    ibyte = ((ibyte << 1) & 0xAA) | ((ibyte >> 1) & 0x55);
    ibyte = ((ibyte << 2) & 0xCC) | ((ibyte >> 2) & 0x33);
    return  ((ibyte << 4) & 0xF0) | ((ibyte >> 4) & 0x0F);
}

16bitなら

unsigned int
wordrev(unsigned int iword)
{
    iword = ((iword << 1) & 0xAAAA) | ((iword >> 1) & 0x5555);
    iword = ((iword << 2) & 0xCCCC) | ((iword >> 2) & 0x3333);
    iword = ((iword << 4) & 0xF0F0) | ((iword >> 4) & 0x0F0F);
    return  ((iword << 8) & 0xFF00) | ((iword >> 8) & 0x00FF);
}

32bitなら
(以下略)

原理は単純なのでよく見ればわかると思いますが
1234 の右/左半分を個々に逆転 -> 2143
2143 の右/左半分をそっくり入れ換え(2個組同士の逆転) -> 4321
この繰り返しということです
この原理が理解できたら、wordrev()をbyterev()を呼び出す形に
書き換えてみましょう(練習問題1)
それから、単純変数に収まらないような長大なビット列を
反転するにはどうすればよいでしょうか(練習問題2)

しかし、16bitや32bitあってもなんの迷いもなくテーブル一発ってな時代が
きっとやってくるんでしょうね:-)
-- 
----_--__---_-_-_-__--_-__-__---_-_----_--_-_---_---_----
_/     TANAKA Yoshitomo       _//
/  Suginami-ku Tokyo, Japan  _// serow@xxxxxxxxxxxxxxxxxx
スレッド概略
[2728(R)](起点)
 └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]