0

私はメモリの場所を読み取っていて、それらの 16 進値を ASCII で出力する必要があるプロジェクトに取り組んでいます。

この言語では 16 ビットの語長が得られるため、一度にニブルを取得して 16 進数に変換するために分割する必要があります。残念ながら、この言語は数学/論理関数に対して and、or、not、および add のみを提供します。

左にシフトし、負のフラグをテストしてシフト後に最後に 1 を追加することで、目的の効果を作成できると考えましたが、これを行うためのより良い方法が必要であると考えています。

任意の洞察をいただければ幸いです。

4

4 に答える 4

0

そのため、私が使用した元の方法が機能しました。誰かが再びこの問題を抱えている場合に備えて、私も別のものを思いついた。

一度に4ビットを評価し、その評価に基づいて数値を作成するサブルーチンを作成しました。一部のCスタイルの擬似コードでは、次のようになります。

16bitSignedInt bin; //binary being analyzed
int value; //number being built

for (int i = 0; i < 4; i++) // while 0-3, for each nibble of the 16 bits
{
   if (bin.bit15 = 1)
      value += 8; // dominate bit in nibble

   bin <<= 1; // left shift 1

   if (bin.bit15 = 1)
      value += 4; // 2nd bit in nibble

   bin <<= 1; // left shift 1

   if (bin.bit15 = 1)
      value += 2; // 3rd bit in nibble

   bin <<= 1; // left shift 1

   if (bin.bit15 = 1)
      value += 1; // last bit in nibble

   bin <<= 1; // left shift 1

   //do work with value
}

粗野ですが効果的です。

于 2011-04-02T00:55:33.787 に答える
0

キャリー付きのアドはありますか?負のテストの代わりに、端からビットを追加し、キャリー付きのゼロを追加して右側に戻します。あまり節約できません。これまでのところ、別の解決策を考えることはできません。左にシフトして少しテストします。設定されている場合は、何かに1を追加して、その何かをシフトします。

uint a,b,i;

b=0;
for(i=0;i<4;i++)
{
   b=b+b;
   if(a&0x8000) b+=1;
   a=a+a;
}

上記のuintが16ビットの場合、上記は12の右シフトになります。aは、記述されているように、bを作成するプロセスで破棄されます。

于 2011-03-31T15:31:05.570 に答える
0

逆に試すことができます: 右シフトを実装しようとする代わりに、総当たりを使用できます。以下は最高ニブルの例です。

unsigned rez, tmp;
for (rez = 0, tmp = some_word & 0x0FFF; tmp != some_word; rez++, tmp += 0x1000);
于 2011-03-31T17:56:38.167 に答える
0

を使用ANDすると、最後の重要なニブルを除くすべてのビットをゼロに設定できます。

0101010111010101
0000000000001111 AND
----------------
0000000000000101

全体を右にシフトすると、次のニブルを読み取ることができます。

0101010111010101 SHR 4
----------------
    010101011101
0000000000001111 AND
----------------
0000000000001101

それはあなたにとって何か役に立ちますか?

于 2011-03-31T11:08:34.873 に答える