2012-10-29 99 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