2010-12-20 3 views
1

16 비트 숫자에서만 이진수 연산을 수행 할 수있는 언어로 작업하지만 32 비트 값에서 2 진수 연산을 사용해야하므로 내 자신의 기능 중 일부. 예를 들어, I 구현 이진 OR로서 :16 비트를 사용하여 32 비트 값에서 비트 시프트 구현

_32bit_or(a,b){ 
    var{ 
    a1=round(a/(2**16)); 
    a2=a%(2**16); 
    b1=round(b/(2**16)); 
    b2=b%(2**16); 
    } 
    .=((a1|b1) * (2**16)) + (a2|b2); 
} 

분할 2 개의 16 비트 부분으로 32 비트 값 또는 각 부분과 재결합한다. 충분히 간단합니다.

하지만 이제는 쉬프트를 구현해야합니다. 쉬워 보이기 쉽지 않습니다. 왜냐하면 쉬프트하고, 쉬프트 한 다음, 재결합하여, 비트를 잃어 버리기 때문입니다! 내가 시도한 것은 :

_32bit_rshift(a,b){ 
    var{ 
    a1=round(a/(2**16)); 
    a2=a%(2**16); 
    } 
    . = ((a1>>b) * (2**16)) + (a2>>b) 
} 

그러나 이것은 물론 언급 한대로 작동하지 않습니다. 누구든지 일부 입력을 제공 할 수 있습니까?

답변

1

왼쪽 쉬프트 1의 경우 AND의 결과가 0이 아닌 경우 상위 워드와 하위 워드를 0x8000으로 이동하고 상위 결과를 1로 OR 한 다음 하위 워드를 시프트합니다.

오른쪽 시프트 1의 경우 AND의 결과가 0이 아닌 경우 하위 워드를 시프트하고 상위 워드를 1로 시프트하고 하위 결과를 0x8000으로 시프트 한 다음 상위 워드를 시프트합니다.

1 비트 이상으로 시프트하는 것은 ORing 전에 AND와 적절한 시프 팅에 더 큰 값을 필요로합니다.