2012-10-29 2 views

답변

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 비트를 지울 것입니다. 하지만 레지스터를 다루는 경우라면 괜찮을 것입니다. (당신이 비트를 클리어하면, 당신이 제로는 더 할 수처럼 정말 아니에요. :))

1

(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... 

이 설정/해제 특정 비트 :

  • XOR : 특정하지만 분명히 모든 : 조금
  • 및 전환 비트
  • 또는 : 비트를 설정하십시오.
  • 하위 :이
  • 추가를 설정 한 경우 조금 웁니다 분명히했다 경우 비트를 설정
  • 을 ANDN (그렇지 않으면 왼쪽 전파는 '캐리'는 생산)로, 조금

  • (1<<n)을 지 웁니다 0 < = N < (비트 워드 크기)

  • LSB_MASK=(1<<n)-1 모든 N 우측 (설정 최하위 비트)
  • 를 갖는 비트 마스크 인 비트 마스크에 비트 위치로 변환하는 데 사용 MSB_MASK=-1<<n가 (WN) 좌단 (최상위) 비트 때 설정 한 W = 갖는 LSB_MASK
-1
왼쪽
[PUSH ax] 
MOV ax, $to 
AND ax, 0 
MOV $to, ax 
[PULL ax] 

한 비트 워드

  • (a + (a & LSB_MASK)) 브랜드 "공간"의 비트 # : 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는 8086이 아닌 MIPS를 사용합니다. 또한 1을 1로 설정하고 0으로 설정하려고합니다. – gusbro