11

32 ビット長の変数 CurrentPosition を 4 つの 8 ビット文字に分割したいと考えています。Cで最も効率的にそれを行うにはどうすればよいですか? 私は 8 ビット MCU、8051 アーキテクチャを使用しています。

unsigned long CurrentPosition = 7654321;
unsigned char CP1 = 0;
unsigned char CP2 = 0;
unsigned char CP3 = 0;
unsigned char CP4 = 0;
// What do I do next? 

CurrentPosition の開始アドレスをポインターで参照し、そのアドレスに 8 2 を 4 回追加するだけでよいでしょうか?

リトルエンディアンです。

また、 CurrentPosition を変更しないでおきたいです。

4

6 に答える 6

22
    CP1 = (CurrentPosition & 0xff000000UL) >> 24;
    CP2 = (CurrentPosition & 0x00ff0000UL) >> 16;
    CP3 = (CurrentPosition & 0x0000ff00UL) >>  8;
    CP4 = (CurrentPosition & 0x000000ffUL)      ;

ポインタを介してバイトにアクセスすることもできますが、

unsigned char *p = (unsigned char*)&CurrentPosition;
//use p[0],p[1],p[2],p[3] to access the bytes.
于 2010-04-30T19:49:50.897 に答える
8

ユニオンの使用を検討する必要があると思います:

union {
   unsigned long position;
   unsigned char bytes[4];
} CurrentPosition;

CurrentPosition.position = 7654321;

バイトは次のようにアクセスできるようになりました: CurrentPosition.bytes[0], ..., CurrentPosition.bytes[3]

于 2010-04-30T20:03:11.973 に答える
2

8 ビット MCU を使用している場合、32 ビット変数全体をシフトするのは少し面倒です。この場合、ポインター演算を使用して CurrentPosition の 4 バイトを読み取る方が適切です。キャスト:

unsigned char *p = (unsigned char*)&CurrentPosition;

CurrentPosition は変更されませんが、p[0] に書き込もうとすると、CurrentPosition の最下位バイトが変更されます。コピーが必要な場合は、次のようにします。

unsigned char *p = (unsigned char*)&CurrentPosition;
unsigned char arr[4];
arr[0] = p[0];
arr[1] = p[1];
arr[2] = p[2];
arr[3] = p[3];

そしてarrで作業します。(最上位バイトが最初に必要な場合は、それらの割り当ての順序を変更してください)。

4つの変数を好む場合は、明らかに次のことができます。

unsigned char CP1 = p[0];
unsigned char CP2 = p[1];
unsigned char CP3 = p[2];
unsigned char CP4 = p[3];
于 2010-04-30T20:02:14.743 に答える
0
CP1 = (unsigned char)(CurrentPosition & 0xFF);
CurrentPosition >>= 8;
CP2 = (unsigned char)(CurrentPosition & 0xFF);
...
于 2010-04-30T19:48:14.677 に答える
0
unsigned char *CP = &CurrentPosition;

これで、元のコードごとの CPn に 経由でアクセスできますCP[n]

于 2010-04-30T20:41:31.260 に答える