1

入力をバイナリで取得し、その逆を別のアドレスに格納する割り当てに取り組んでいます。ロジックをダウンさせることができるまで 4 ビット ワードで作業しており、すべてが機能したら 16 ビット ワードに拡張できます。

例: 1010100101001011 ==> 1101001010010101

これまでの私の方法論は次のとおりです。

ワード: 1010 マスク: 0001 結果: 0000

1) 1010 & 0001 - そしてこれを一緒に

 result is: 0000 

(結果の最上位ビットとして最下位ビットのみを格納できるようにしたい)

2) 1010 & 0010 - マスクをインクリメントし、それを単語と ANDing します

結果: 0010

ここで、2 の位のビットを取り、それを結果レジスターの 4 の位に格納します。

これは、1 つのビットを分離して別の場所に保存するロジックを考え出す際に問題が発生している場所です。

ヒントやアドバイスをいただければ幸いです。

4

2 に答える 2

0

シフトまたは除算命令を持たない最小限の LC-3 を意味すると仮定すると、次のようになります。

  • ADD を使用して、マスクを左にシフトできます
  • ADD を使用して結果を左にシフトできます
  • マスクと入力のANDがゼロかどうかをテストできます
  • テストの結果を使用して、結果を左にシフトした後に結果に 0 または 1 を追加します

ここでは C レンディション

uint16_t reverse16 (uint16_t input)
{
    uint16_t result = 0u;
    uint16_t mask = 1u;
    int i;

    for (i= 0; i < 16; i++)
    {
        result = result + result;
        if (0u != (input & mask))
        {
            result += 1u;
        }
        mask = mask + mask;
    }
    return result;
}

bithacksサイトには、この問題やその他のビットレベルの問題に対する興味深いアプローチがたくさんあります。

于 2012-10-28T22:17:13.857 に答える
0

以下は、16 ビット ワードのビット反転の単純な (しかし理解しやすい) 実装の C のロジックです。

uint16_t w = 0xb2e3;         // our 16 bit word
uint16_t mask0 = 0x0001;     // mask for LS bit
uint16_t mask1 = 0x8000;     // mask for MS bit
uint16_t shift = 15;         // distance between high and low bit positions

for (int b = 0; b < 8; ++b)  // for each pair of low/high bits
{
    uint16_t b0 = w & mask0; // get low bit
    uint16_t b1 = w & mask1; // get high bit
    w &= ~(mask0 | mask1);   // clear low/high bit in word
    b0 <<= shift;            // swap bit positions
    b1 >>= shift;
    w |= (b0 | b1);          // insert swapped bits back into word
    mask0 <<= 1;             // update masks for next pair of bits
    mask1 >>= 1;
    shift -= 2;              // update distance for next pair of bits 
}

printf("%#x\n", w);          // w should now contain 0xc74d

テストコード: http://ideone.com/GgbzHw

上記のループを LC3 に変換するのはかなり簡単ですが、合成は必要ですが、命令セットが非常に限られているため、難しいかもしれません|<<>>

于 2012-10-28T22:17:27.040 に答える