는 사실, 당신은 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
대단히 감사합니다! 그것은 매우 철저한 대답과 설명이었습니다. –