假设我有一个寄存器 t0 0x0000 0000 0000 0000 0000 0001 0010 0001,我想把所有的 1 变成 0。我该如何一一做到这一点?(不使用移动 $t0,$0)
我正在考虑使用 sb(存储字节)。
假设我有一个寄存器 t0 0x0000 0000 0000 0000 0000 0001 0010 0001,我想把所有的 1 变成 0。我该如何一一做到这一点?(不使用移动 $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)
,其中 0<=n< (以位为单位的字长)用于将位位置转换为位掩码
LSB_MASK=(1<<n)-1
是一个位掩码,其中所有n最右边(设置了最低有效位) MSB_MASK=-1<<n
当 W=# of bits in word 时,设置了 (Wn) 个最左边(最高有效)位(a + (a & LSB_MASK))
在 LSB_MASK 左侧留出“空间”一位不知道 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 位……等等。但是,如果您正在处理寄存器,这会很好。(一旦你清除了一点,你就不能让它变得更零了。:))
[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