2012-07-10 3 views
4

다음 계산을 수행하는보다 효율적인 방법이 있습니까? 그것은 잘 작동하지만, 뭔가 계산 및 회피 속도를 피하기 위해 x &= (1 << 8) - 1^1 << 3 쓸 수 있습니다 말해. 함수에서BigInts로 비트 마스크 만들기

x ^= 1 << 3 & x 

:

def unset_mask(width, index): 
    return (1 << width) - 1^1 << index 

x = 0b11111111 
x &= unset_mask(8, 3) 
assert x == 0b11110111 

답변

3

는 사실, 당신은 width을 명시 할 필요가 없습니다. 이 작업을 수행 할 때 Bigints 올바른 방식으로 작동 :

음수는 "infinite" string of ones preceding them이 때문입니다
>>> bin(255 & ~(1 << 3)) 
'0b11110111' 
>>> bin(65535 & ~(1 << 3)) 
'0b1111111111110111' 
>>> bin(75557863725914323419135 & ~(1 << 3)) 
'0b1111111111111111111111111111111111111111111111111111111111111111111111110111' 

. 따라서 양수 ("infinte"문자열로 시작하는)를 보완하면 음수 (정확히 -(x + 1))가됩니다. 음수의 표현을 bin으로 신뢰하지 마십시오. 메모리의 실제 비트를 반영하지 않습니다.

그래서 당신과 같이 unset_mask를 다시 작성합니다 :

def unset_mask(index): 
    return ~(1 << index) 

x = 0b11111111 
x &= unset_mask(3) 
print x == 0b11110111 # prints True 
+0

대단히 감사합니다! 그것은 매우 철저한 대답과 설명이었습니다. –

1

이 비트를 설정 해제합니다

def unset_bit(x, n): 
    return 1 << n & x^x 
+0

나는 이보다 짧은 얻을 수 없습니다. –

1

당신은 x에 조금을 취소하려면이 옵션을 사용할 수 있습니다

x &= ~(1 << index) 
관련 문제