0

MIPSアセンブリでは、文字列のi番目とj番目のビットのみを抽出して、これらの個々のビットを元の場所に戻すことができますか。

検討してください:1100

抽出:2番目3番目のビットを交換し、結果1010を取得します

4

2 に答える 2

2

AND真理値表の結果を見てくださいr=a AND b

ab r
00 0
01 0
10 0
11 1

次の2つのケースを見てください。

10 0
11 1

1とANDで結合されたものはすべてそれ自体ですが、現在はこれら2つのケースです。

00 0
01 0

ゼロとAND演算されたものはすべてゼロです。

cビットを抽出するための4ビットabcdを使用して、andingのこれらの2つの機能を認識し、0でandedし、1でandedします。

    abcd
AND 0010
=========
    00c0

ビットcを分離しましたが、それが0または1ビットであるかどうかは関係ありません。ゼロでandedされたビットは強制的にゼロにされ、1でandedされたビットは変更されませんでした。

同様に、abcdを0100でアンディングすると、0b00でビットbが分離されます。

これで、2つの中間結果0b00と00c0が得られました。位置を入れ替えたい場合、シフトは命令セットに応じてそれを行います(mipsと言ったのは知っていますが、フォローしてください)一部の命令セットはキャリービットで回転またはシフトし、一部はゼロまたは算術シフトで回転またはシフトしますvs論理シフトは、ゼロのシフトではなく、最上位ビットを複製する場合があります。したがって、使用している命令セットで使用可能なシフトを調べる必要があります。ゼロのソリューションにクリーンなシフトがない場合は、シフトの副作用をクリーンアップするためにさらに操作を追加する必要があります。この場合、bビットを1つ上に右に移動し、cビットを1つ上に左に移動するため、検索して使用する必要のある操作は次のようになります。

0b00 >> 1 = 00b0
00c0 << 1 = 0c00

これで、ビットは正しいビット位置になりました。3つのことがあります。

abcd
0c00
00b0

したがって、調べるべき2つの真理値表があります。1つは上記のAND真理値表であり、1つで何でも、ゼロで何でも知っています。もう1つはOR真理値表です

ab r
00 0
01 1
10 1
11 1

特に最初の2つ

00 0
01 1

ゼロとOR演算されたものはすべてそれ自体です。次の2つに注意してください

10 1
11 1

1とORされたものはすべて1です。

ANDとORを使用してビットを配置するにはどうすればよいですか?さて、ゼロでORされたものはそれ自体であり、もう1つは1でANDされたもの自体であるという2つの選択肢があります。私たちがする必要があるのは、元の番号abcdを操作して、それをa00dまたはa11dにすることです。これにより、ANDテーブルとORテーブルの残りの半分が機能します。0でandedされたものはすべて0であり、1でorredされたものはすべて1です。したがって、abcdをa00dに変換するには、1001を使用する必要があります。

    abcd
AND 1001
=========
    a00d

aとdが1であり、それ自体がbであり、cが0である場合は0です。

他の選択肢は

    abcd
OR  0110
=========
    a11d

aとdは0で順序付けられているため、変更されません。bとcは1で順序付けられているため、これらのビット位置は1になります。

最後のステップは、他の中間値を取り、それらを混合することです

    a00d
OR  0c00
=========  
    ac0d

    ac0d
OR  00b0
=========  
    acbd

単純にこれを行った場合、他の選択はより複雑になります

    a11d
AND 0c00
========
    0c00

そのIDを使用するには、0c00を変更して1c11にする必要があります。

0c00 OR 1011 = 1c11
1c11 AND a11d = ac1d
00b0 OR 1101 = 11b1
11b1 AND ac1d = acbd

要するに、従来の解決策は、分離するために1を使用し、ビット位置をクリーンアップしてから新しい値にゼロを使用することです。

abcd AND 0100 = 0b00
abcd AND 0010 = 00c0
0b00 >> 1 = 00b0
00c0 << 1 = 0c00
abcd AND 1001 = a00d
a00d OR 0c00 = ac0d
ac0d OR 00b0 = acbd

Cでは、これは次のようになります(これは一時変数を示します)

//abcd is our original variable
tempb = abcd & 4;
tempc = abcd & 2;
tempb = tempb >> 1;
tempc = tempc << 1;
result = abcd & 9; 
result = result | tempc;
result = result | tempb;
//and finished, result contains the...result.

あなたはすでにgusbroから完全な答えを得ています、これは答えの半分です、私は論理演算を使用するタスクが問題の半分であると思います、問題の残りの半分は問題の命令セットの命令とレジスタを選択することです(私がどのように注意するかこれまでのところ、命令セットを指定する必要なしに問題を解決しました。この時点では、任意の命令セットを使用できるため、ステップごとに複数の命令が必要になる可能性がありますが、この点では一般的です)。

これは4ビットのソリューションであることに注意してください。レジスタに4ビットを超える命令セットを使用する可能性が高いため、これらの式のオペランドの左側にあるビットを知って、他のオペランドを台無しにしないようにする必要があります。ビット。

gusbroが使用した、私が使用しなかったもう1つのアイデンティティは、それ自体とXORされたものがゼロであるということです。彼の2つのxor演算は、複数の命令を必要とするか、追加のメモリサイクルが必要になる可能性のある命令セットに応じて、単一の演算と定数の演算で実装できます。

このタイプの作業の鍵は、これらの論理的アイデンティティを理解し、それらを適用することです。誰かが(マスクとシフト)マスクとは、保持したいビット位置にある定数を使用することを意味し、シフトするとビットが特定の位置に配置されます。たとえば、abcdを取得してcビットを分離したい場合などです。結果がゼロまたは1になるように、「マスクしてシフト」します。

abcd AND 0010 = 00c0
00c0 >> 1 = 000c

およびはマスクであり、シフトはシフトであり、結果は、cが0の場合は0、cが1の場合は1になります。

同様にあなたはすることができます

abcd >> 1 = 0abc
0abc AND 0001 = 000c

シフトしてからマスクします。

あなたの宿題は次のように再配置することができます

abcd >> 1 = 0abc
abcd << 1 = bcd0
0abc AND 0010 = 00b0
bcd0 AND 0100 = 0c00
abcd AND 1001 = a00d
00b0 OR 0c00 = 0cb0
a00d OR 0cb0 = acbd

テーマの他のバリエーションを見ることができます。これらのバリエーションは、ターゲットとする命令セットに応じて最適化に変わる可能性があります。

于 2013-02-06T01:30:49.613 に答える
1

あなたはマスクとシフトを適用することによってそれを行うことができます。データがレジスタに格納されていると仮定すると、i番目のビットを取得するには、定数2 ^ iのANDを適用して、i番目のビットを除くすべてのビットをクリアします。次に、左シフトまたは右シフトのいずれかを使用して、そのビットを他の位置に簡単に「移動」できます。

さて、2ビットを交換するにはもう少しいじる必要があります。たとえば、2つのビットをいくつかのレジスタに抽出し、元のレジスタからthosビットをクリアしてから、2つのレジスタのそれぞれをシフトして、「スワップ」位置に配置し、最後にすべてをORします。

例えば:

  li $t0, 12         # Our constant, 1100b, is stored in $t0
  andi $t1, $t0, 2   # Mask the second bit and put it in $t1
  andi $t2, $t0, 4   # Mask the third bit and put it in $t2
  xor $t0, $t0, $t1  # Ensures the second bit $t0 is zero 
  xor $t0, $t0, $t2  # Ensures the third bit $t0 is zero 
  sll $t1, $t1, 1    # Moves $t1 one position to the left (second bit goes to third bit)
  srl $t2, $t2, 1    # Moves $t2 one position to the right (third bit goes to second bit)
  or $t1, $t1, $t2   # now we OR everything
  or $t0, $t0, $t1   # to get the final result, in this case 1010b
于 2013-02-05T20:54:01.350 に答える