レジスタ t0 0x0000 0000 0000 0000 0000 0001 0010 0001 があり、すべての 1 を 0 に変換したいとします。これを 1 つずつ行うにはどうすればよいですか? (ムーブ $t0,$0 は使用しない)
sb(ストアバイト)の使用を考えています。
レジスタ t0 0x0000 0000 0000 0000 0000 0001 0010 0001 があり、すべての 1 を 0 に変換したいとします。これを 1 つずつ行うにはどうすればよいですか? (ムーブ $t0,$0 は使用しない)
sb(ストアバイト)の使用を考えています。
式 (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...
特定のビットをクリア/設定する方法は複数あります。
andn: 少しクリア
(1<<n)
、 with 0<=n< (ビット単位のワードサイズ) は、ビット位置をビットマスクに変換するために使用されます
LSB_MASK=(1<<n)-1
右端のn 個すべてを持つビット マスクです(最下位ビットが設定されます) 。MSB_MASK=-1<<n
W=ワード内のビット数の場合、(Wn) 個の左端 (最上位) ビットが設定されている(a + (a & LSB_MASK))
LSB_MASK の左側に 1 ビットの「余地」を作ります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 ビットがクリアされます。ただし、レジスタを扱っている場合はこれで問題ありません。(少しクリアしたら、それ以上ゼロにできるわけではありません。:))