C言語関係掲示板

過去ログ

No.306.エンディアンを考慮したビットシフト

[戻る] [ホームページ]
No.1834

エンディアンを考慮したビットシフト
投稿者---ぺーぺー(2002/06/27 00:27:34)


はじめまして。プログラム初心者 ぺーぺーです。
今まで、リトルエンディアンを扱うCPUで考えて作ったプログラムをビッグエンディアン系コンピュータで動作するプログラムにしようとしています。

そこで困っているのが、ビットシフトを行うときにどうすればよいかということです。
ビット列とアドレスの関係として、

ビット  15 14 13 12 11 10 9 8  7 6 5 4 3 2 1 0
アドレス 1000H          1001H
ビッグエンディアンの場合

ビット 0 1 2 3 4 5 6 7  8 9 10 11 12 13 14 15
アドレス1000H          1001H
リトルエンディアンの場合

と言う説明がここに載っていました。http://www.geocities.co.jp/SiliconValley/3150/endian.html

まず、疑問なのがリトルエンディアンで例えば0x6789を表すと
ビット  1110 0110 1001 0001
アドレス 1000 1001 1002 1003

ビッグエンディアンの場合
ビット  0110 0111 1000 1001
アドレス 1000 1001 1002 1003
となっているのでしょうか?

そして、これを3ビット左シフトした場合、(巡回ではない)
リトルエンディアンの場合
0011 0100 1000 1000

ビッグエンディアンの場合
0011 1100 0100 1000
となるのでしょうか?

もともと、リトルエンディアンを考えて行っていた計算は

ushort pn;
pn = (pn >> 2) + (((pn << 1) ^ (pn << 8) & 0x0300);

です。 これをビッグエンディアンで行う場合にどうすればよいか知りたかった
のですが、いろいろ考えているうちにドツボにはまりました。

基本的な質問で申し訳ないのですが、非常に困っています。
ご回答、どうかよろしくお願い致します


No.1864

Re:エンディアンを考慮したビットシフト
投稿者---kikk(2002/06/28 14:19:38)


ども。


>と言う説明がここに載っていました。http://www.geocities.co.jp/SiliconValley/3150/endian.html

このURLの説明はかなり誤解しやすいとおもいます(わかってる人むき?)。
上記URLでもふれられていますが、並び順にはビットオーダとバイトオーダ
があります。混乱の元はこれらを混同しているからだと思います。

で。
通常、(アセンブリ言語レベルまで含む)プログラム/プログラマにとっては
エンディアンはバイトオーダを意味します。バイトオーダバイト単位で
区切った並びを指します。単純に、

0x1234 の格納状況は

big:
addr value
1000 0x12
1001 0x34

little:
1000 0x34
1001 0x12

のように考えてください。各バイト中のビットパターンは意識する必要は
ありません。

演算では、単一のワードとして扱う限りは、ビットオーダもバイトオーダも
意識することはありません。机上でおこなうのと同じと考えてください。

バイトオーダを意識しなければならないのは、ある領域を1つのワードとして
あつかったり複数のバイトの集合として扱ったりする場合や、ホスト間で
データのやり取りを行う場合です。


>まず、疑問なのがリトルエンディアンで例えば0x6789を表すと
>ビット  1110 0110 1001 0001
>アドレス 1000 1001 1002 1003
>
>ビッグエンディアンの場合
>ビット  0110 0111 1000 1001
>アドレス 1000 1001 1002 1003
>となっているのでしょうか?

2進8桁でバイトになるので、
アドレス 1000    1001
となります。

たしかに実際のハードウェア上ではたぶん上記のようなビット配置になって
いるとおもわれますが、プログラム/プログラマはそのことはわからないし、
知る必要もありません。


>もともと、リトルエンディアンを考えて行っていた計算は
>
>ushort pn;
>pn = (pn >> 2) + (((pn << 1) ^ (pn << 8) & 0x0300);
>
>です。 これをビッグエンディアンで行う場合にどうすればよいか知りたかった

これだけでは、このコードが本当にリトルエンディアン(だけ)を考えて
つくってあるのか判断できません。見た感じエンディアンは関係なさそうに
思えますが、どうでしょうか。


まとめると、
1. エンディアンによって変わるのは(通常)バイト単位での並び順
2. 演算は机上で人間のわかりやすい表現で行うのと同じ
3. (2より、)バイト中のビットパターンを意識することはない
ということです。


では。