0

レジスタ t0 0x0000 0000 0000 0000 0000 0001 0010 0001 があり、すべての 1 を 0 に変換したいとします。これを 1 つずつ行うにはどうすればよいですか? (ムーブ $t0,$0 は使用しない)

sb(ストアバイト)の使用を考えています。

4

3 に答える 3

1

式 (a & (-a)) は、ワードの最下位ビットに相当します。例えば

0xbcd0 = 1011 1100 1101 0000 =  48336  
         0100 0011 0011 0000 = -48336  
-------------------------------------
 AND =   0000 0000 0001 0000 <-- lsb set

擬似コード:

while (-a & a) { a ^= (-a & a); }  // cache the common sub expression...

特定のビットをクリア/設定する方法は複数あります。

  • xor: 少し切り替えます
  • and: 特定のビットを除くすべてをクリアする
  • または: ビットを設定します
  • sub: 設定されている場合は少しクリアします
  • add: クリアの場合はビットを設定します (それ以外の場合は左に伝播する「キャリー」を生成します)
  • andn: 少しクリア

  • (1<<n)、 with 0<=n< (ビット単位のワードサイズ) は、ビット位置をビットマスクに変換するために使用されます

  • LSB_MASK=(1<<n)-1右端のn 個すべてを持つビット マスクです(最下位ビットが設定されます) 。
  • MSB_MASK=-1<<nW=ワード内のビット数の場合、(Wn) 個の左端 (最上位) ビットが設定されている
  • (a + (a & LSB_MASK))LSB_MASK の左側に 1 ビットの「余地」を作ります
于 2012-10-29T09:22:36.473 に答える
0

Dunno MIPS ですが、疑似コードでビットごとにクリアする方法を次に示します。レジスターは正常に機能し、左側からのシフトアウトは破棄されるだけだと思います。

mask = -2
Til param = 0:
    (clearing bits one at a time is stupid unless you care which ones are set)
    If (param AND mask) != param, do something

    param <== param AND mask
    Shift mask one bit left

技術的には、これにより下位ビットがクリアされ、次に下位 2 ビットがクリアされ、次に下位 3 ビットがクリアされます。ただし、レジスタを扱っている場合はこれで問題ありません。(少しクリアしたら、それ以上ゼロにできるわけではありません。:))

于 2012-10-29T05:41:20.233 に答える