私は昨日面接を受けました。
私が尋ねられた質問の 1 つは、バイトの上位 4 ビットを下位 4 ビットに置き換えるにはどうすればよいかということでした。ここではネイティブ C について話しています。
たとえば、次のバイトを考えてみましょう: AB 出力は次のようになります: BA
ええと、そこの男は、それは単一のコマンドで実行できると私に言いました。私は3つのコマンドでそれを行うことができました。
私は彼に答えを求めたが、彼は気が進まなかった。
ありがとう!
uint8_t b = 0xab;
b = (b << 4) | (b >> 4);
b
現在は 0xba です。
そうですか?
これが、あなたのインタビュアーが求めていた答えかもしれません。
unsigned char a = 0xab;
a *= 16.0625;
短くてきれいですが、コンパイルするとあまり効率的ではありません。
ror
x86 の 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
ます。
おそらく私はここで技術的なことを理解しているだけですが、あなたが私たちに与えた指示は、2 つのニブルを交換するのではなく、高い方を低い方に置き換えることです。私の考えでは、必ずしも0xBAではなく、0xABを0xBBに変換します。
b = (b << 4) | (b & 0xf);
それをします。下位ビットに何が起こるか心配していない場合は、
b <<= 4;