2006年06月19日

MSB と LSB

普通のOS上で動くプログラムを作っているだけでは気にならないのですが、 マイコン用のプログラムや、 他の機器を制御するようなプログラムの場合、 流れてくるデータの内、先に来る方が高い桁なのか低い桁なのか、 後に来る方が上位の桁なのか下位の桁なのか混乱することがあります。

ビット単位で考えるとき、
最上位ビットを 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
(MSB)
unsigned long data
 
(LSB)
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))

posted by 七癖 at 17:22| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。