2012-02-09 5 views
1

다음을 수행해야하는 부분에서 곤란을 겪습니다. 숫자 X (Say 10101010)와 숫자 Y (Say 1110)와 두 위치 변수 i, j (Say i = 1, j = 4)라고 가정하면, X의 모든 비트를 i에서 j의 비트와 일치 시키도록 설정해야합니다. 위의 예에서 대답은 101이어야합니다 | | 0.X의 비트 서브 세트를 Y의 서브 세트로 설정하는 방법

내가 생각했던 어떤 해결책이었다 : 여기

1. Right shift X >> i 
3. Run loop from 0 to j-1 
2. if(!(X (lsb)^Y(lsb)), then continue, else X(lsb) = ~X(lsb) 

것은 내가 개별 비트와 함께 재생하는 방법을 모르겠습니다입니다.

답변

4
  1. 유일한 제로 비트 위치 ij에있는 마스크를 만들기 ~ (2 J + 1 - 2 I)

  2. 결과 = (mask & X) | (Y << i)

파이썬에서의 예 :

def replace_bits(X, Y, i, j): 
    mask = ~(2**(j+1) - 2**i) 
    return (mask & X) | (Y << i) 

>>> replace_bits(int('10101010', 2), int('1110', 2), 1, 4) 
188 
>>> bin(replace_bits(int('10101010', 2), int('1110', 2), 1, 4)) 
'0b10111100' 
4

2^j - 1은 첫 번째부터 j 번째 비트가 1 인 숫자를 제공합니다. (2^I - - 1) = (1 - 2^J)

그래서 지금 Z 1

로 j 개의 세트 I에서의 모든 비트가 나는 비트로 Y를 왼쪽 시프트.

X - (X & Z) + Y가 최종 답변입니다.

관련 문제