说我有一个寄存器t0 0x0000 0000 0000 0000 0000 0001 0010 0001 我想将所有1变为0。 我如何逐一做到这一点? (不使用move $ t0,$ 0)
我正在考虑使用sb(存储字节)。
答案 0 :(得分:1)
表达式(a&(-a))等于单词中的最低有效位。 e.g。
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)
,0 <= n&lt; (字位大小)用于将位位置转换为位掩码
LSB_MASK=(1<<n)-1
是一个位掩码,其中所有 n 最右边(设置最低有效位)MSB_MASK=-1<<n
设置(W-n)最左侧(最高有效)位,当W =字中的位数(a + (a & LSB_MASK))
为LSB_MASK左侧的一位创造“空间”答案 1 :(得分: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位等。但如果您正在处理寄存器,这将没有问题。 (一旦你清理了一下,它就不是你可以让它更多零。:))
答案 2 :(得分:-1)
[PUSH ax]
MOV ax, $to
AND ax, 0
MOV $to, ax
[PULL ax]
拥有:p & 0 = 0
,然后:
0000 0000 0000 0000 0000 0001 0010 0001
0000 0000 0000 0000 0000 0000 0000 0000
--------------------------------------- AND
0000 0000 0000 0000 0000 0000 0000 0000