2012-10-29 98 views

回答

0

不知道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 ...等。但如果你正在处理寄存器,这将会很好。 (一旦你清理了一下,这不是真的很喜欢你可以把它为零。:))

1

(一&(-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:切换有点
  • 和:清晰的一切,但一定位
  • 或:设置位
  • 子:清除一个位,如果它被设置
  • 添加:设置一个位,如果它是清楚的(否则产生“进位”的是左侧传播)
  • ANDN:清除位

  • (1<<n),与0 < = N <(以比特字大小)用于比特位置转换为位掩码

  • LSB_MASK=(1<<n)-1是一个位掩码,其具有所有ñ最右侧(设置至少显著位)
  • MSB_MASK=-1<<n已经(WN)最左边的(最显著)位设置,当W =在字
  • (a + (a & LSB_MASK))品牌 “房间” 比特的一个比特到LSB_MASK
-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 
+1

OP正在使用MIPS而不是8086;并且还想将1s逐个变为0 ... – gusbro