ビット単位で考えるとき、
最上位ビットを MSB (Most Significant Bit)
最下位ビットを LSB (Least Significant Bit)
と呼びます。
バイト単位でも同様に、
最上位バイトを MSB (Most Significant Byte)
最下位バイトを LSB (Least Significant Byte)
となります。
また、
上位のデータから並べる方法をビッグエンディアン(big endian)
下位のデータから並べる方法をリトルエンディアン(little endian)
といいます。
さて、MMCの仕様書には、下のような表がたくさん出てきます。
BYTE\bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||
0 |
|
|||||||||||
1 | ||||||||||||
2 | ||||||||||||
3 |
(タグに慣れていないので、上手く表示されているか不安です。)
この場合、
0バイト目の7ビット目が最上位ビット
3バイト目の0ビット目が最下位ビット
となります。
このように決められたバイト列 Buf[4] に DWORD(=unsigned long)データlbaをセットするには、
Buf[0] = (BYTE)(lba >> 24);
Buf[1] = (BYTE)(lba >> 16);
Buf[2] = (BYTE)(lba >> 8);
Buf[3] = (BYTE)(lba);
とします。
また、こうして得た Buf[4] は、
lba = ((DWORD)Buf[0] << 24)
| ((DWORD)Buf[1] << 16)
| ((DWORD)Buf[2] << 8)
| ((DWORD)Buf[3]);
のように結合することで、DWORD型のデータとして扱えます。
最後に、Microsoft Visual C++には、
こういった操作の手間を省くための便利なマクロがいくつか用意されています。
#define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))
#define LOBYTE(w) ((BYTE)(w))
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
#define LOWORD(l) ((WORD)(l))
#define MAKELONG(a, b) ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))
#define MAKEWORD(a, b) ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))