急に思い出しながら書いてますので間違ってたらご容赦を 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