2014-04-16 4 views
0

예를 들어, 7과 같이 임의의 비트 수를 전달해야하는 함수가 있습니다. 해당 비트 수와 함께 사용할 수있는 최대 수를 계산하는 것이 힘든 방법일까요? 예를 들어, 8을 전달하면이 함수는 255를 반환합니다.주어진 비트 수에서 가능한 최대 값을 계산하십시오.

이 작업을 수행하는 데 직접적인/효과적인 방법이 있습니까?

+0

'(2 ** n) -1'은 가장 큰 값을 빨리 주려고합니다. – TyrantWave

답변

5

당신은 그냥 할 수있는 (나는 이것이 매우 간단하고 효율적이다라고 말하고 싶지만) :

def max_bits(b): 
    return (2 ** b) - 1 

데모 :

>>> max_bits(8) 
255 
진 곳 값은 항상의 지수이기 때문에이 작동

2, 그래서 이것은 아마도 가장 간단하고 이해하기 쉽습니다.

+0

최대 값을 1로 감산해야합니다. – TyrantWave

+0

@TyrantWave 감사합니다. –

4

레프트 비트 숫자로 번호 1 번 감산 :

def max_bits(b): 
    return (1 << b) - 1 

데모 :

>>> import timeit 
>>> def max_bits_bitshift(b): 
...  return (1 << b) - 1 
... 
>>> def max_bits_exp(b): 
...  return (2 ** b) - 1 
... 
>>> timeit.timeit('f(256)', 'from __main__ import max_bits_exp as f') 
2.767354965209961 
>>> timeit.timeit('f(256)', 'from __main__ import max_bits_bitshift as f') 
0.49823594093322754 
:

>>> max_bits(8) 
255 
>>> max_bits(256) 
115792089237316195423570985008687907853269984665640564039457584007913129639935L 

Bitshifting 2의 지수를 사용하는 것보다 빠르다

256 비트 숫자가 5 배 이상 빠릅니다!

+0

조숙 한 최적화. –

+0

@ErikAllik : 왜 조기 최적화입니까? 나는 더 효율적인 방법으로 이것을 알게된다. 다른 옵션이 더 읽기 쉽거나 유지 보수하기가 쉽지 않은 것입니다. –

+0

@ErikAllik : 사람들은 코드를 최적화해야 할 때 사용할 메소드를 어떻게 발견 할 것입니까? 결정적인 루프에서 비트 마스크를 만들 때 5 배의 속도 차이가 큰 차이를 만들 수 있습니다. 이 기회가 깨어거야, 그리고 향후 몇 년의 * 많은 * 사람들이 참고 자료로 사용할 수 있으며, 스택 오버플로 대답이다,이 같은 정보는 * * 최적화 사람에게 중요하다. –

관련 문제