5

私は昨日面接を受けました。

私が尋ねられた質問の 1 つは、バイトの上位 4 ビットを下位 4 ビットに置き換えるにはどうすればよいかということでした。ここではネイティブ C について話しています。

たとえば、次のバイトを考えてみましょう: AB 出力は次のようになります: BA

ええと、そこの男は、それは単一のコマンドで実行できると私に言いました。私は3つのコマンドでそれを行うことができました。

私は彼に答えを求めたが、彼は気が進まなかった。

ありがとう!

4

5 に答える 5

10
uint8_t b = 0xab;

b = (b << 4) | (b >> 4);

b現在は 0xba です。

そうですか?

于 2013-05-22T19:58:32.393 に答える
8

これが、あなたのインタビュアーが求めていた答えかもしれません。

unsigned char a = 0xab;
a *= 16.0625;

短くてきれいですが、コンパイルするとあまり効率的ではありません。

于 2013-05-24T14:10:40.397 に答える
6

rorx86 の gcc では、単一のインライン アセンブラー操作として使用できます。

unsigned char a = 0x45;

asm("ror $4,%1" : "+r" (a));

printf("0x%x\n", a);

出力し0x54ます。

別の方法として、コメントで OmriBarel が示唆しているように、いくつかの準備を行うことができれば、ルックアップも機能します。

uint8_t* lookup = malloc(256);
unsigned int i;
for(i=0; i<256; i++) lookup[i]= i>>4 | i<<4;

uint8_t a = 0x54;
a = lookup[a];
printf("0x%x\n", a);

出力し0x45ます。

于 2013-05-22T20:18:42.617 に答える
1

おそらく私はここで技術的なことを理解しているだけですが、あなたが私たちに与えた指示は、2 つのニブルを交換するのではなく、高い方を低い方に置き換えることです。私の考えでは、必ずしも0xBAではなく、0xABを0xBBに変換します。

b = (b << 4) | (b & 0xf);

それをします。下位ビットに何が起こるか心配していない場合は、

b <<= 4;
于 2013-05-22T20:14:08.773 に答える