タイトル通り実際に自分が使ったものでbit操作が中心の忘備録。高級なライブラリがいつでも使えるとは限らないので。今後も順次追加できたらいいな。
ビット順の入れ替え
8bit 2進数 D₇ D₆ D₅ D₄ D₃ D₂ D₁ D₀ を D₀ D₁ D₂ D₃ D₄ D₅ D₆ D₇にする、要はMSBとLSBを逆順にする
x = ((x & 0x55) << 1) | ((x & 0xAA) >> 1);
x = ((x & 0x33) << 2) | ((x & 0xCC) >> 2);
x = (x << 4) | (x >> 4);
x &= 0xff;
- 1~3行目は順番不問、Xに1バイトの制限があれば4行目は不要
- ビットストリームは当然D₀から送られてくる訳で、左シフトしながらbyteに格納するとD₀-D₇になる。これをbyteデータとして意味あるものにするためには順番をひっくり返す必要がある
- 要はバイト内で逆順ソートしてるだけ
- swapの単位を広げていけば16bit(2byte)版、32bit(4byte)版、と拡張できそう
BMPファイルの操作
24bit(16万色)BMP(並び順はBGR)を16bit(6.5万色)RGBに変換する
buffer[d] = (buf[s]>>3 | buf[s+1]>>2<<5 | buf[s+2]>>3<<11) >> 8
buffer[d+1] = (buf[s]>>3 | buf[s+1]>>2<<5 | buf[s+2]>>3<<11) & 0xff
s += 3
d += 2
16bit(6.5万色)RGBをファイル格納用に16bitBGRに変換する
newColor = ((color >> 5) & 0x0007c0 | \
(color >> 6) & 0x00001f | \
(color << 11) & 0x00f800)