복사 한 내용은 코드를 생성하기위한 템플릿입니다. 이 템플릿을 다른 언어로 번역하지 않고 빠른 실행을 기대하는 것은 좋지 않습니다. 템플릿을 확장합시다.
(T) ~ (T) 0은 "T 유형에 맞는만큼 1 비트"를 의미합니다. 이 알고리즘은 우리가 우리가 관심을 가질만한 다양한 T-크기에 계산됩니다 4 마스크를 필요로한다.
>>> for N in (8, 16, 32, 64, 128):
... all_ones = (1 << N) - 1
... constants = ' '.join([hex(x) for x in [
... all_ones // 3,
... all_ones // 15 * 3,
... all_ones // 255 * 15,
... all_ones // 255,
... ]])
... print N, constants
...
8 0x55 0x33 0xf 0x1
16 0x5555 0x3333 0xf0f 0x101
32 0x55555555L 0x33333333L 0xf0f0f0fL 0x1010101L
64 0x5555555555555555L 0x3333333333333333L 0xf0f0f0f0f0f0f0fL 0x101010101010101L
128 0x55555555555555555555555555555555L 0x33333333333333333333333333333333L 0xf0f0f0f0f0f0f0f0f0f0f0f0f0f0f0fL 0x1010101010101010101010101010101L
>>>
당신은 32 비트 경우에 생성 된 마스크는 하드 32 비트에서 일치하는지 알 수 있습니다를 C 코드. 구현 세부 사항 : 32 비트 마스크 (Python 2.x)에서 접미어 L
을 잃고 Python 3.x의 모든 접미어 L
을 잃습니다.
전체 템플릿과 (T) ~ (T) 0 케이 퍼는 단지 난해한 궤변임을 알 수 있습니다. k 번째 바이트 타입 아주 간단히 말하면, 4 개는 마스크 필요
k bytes each 0x55
k bytes each 0x33
k bytes each 0x0f
k bytes each 0x01
을 최종 시프트는 단지 (즉 8 * (K-1)) N-8 비트이다. 옆으로 : 템플릿 코드가 CHAR_BIT가 8이 아닌 머신에서 실제로 작동하는지는 의심 스럽지만 요즘에는 그다지 많지 않습니다.
업데이트 : C에서 Python으로 이러한 알고리즘을 음역 할 때 정확성과 속도에 영향을주는 또 다른 사항이 있습니다. C 알고리즘은 종종 부호없는 정수를 가정합니다.C에서 부호없는 정수 연산은 2 ** N을 표준으로합니다. 즉, 최하위 N 비트 만 유지됩니다. 오버플로 예외는 없습니다. 많은 비트 트위 들링 알고리즘이 이것에 의존합니다. 그러나 (a)는 파이썬의 int
및 long
(b)는 오래된 파이썬 2.X는 최근 파이썬 2.Xs가 자동으로 int
long
에 파이썬 3.x를 int
== 파이썬 2.x에서 long
을 촉진 예외를 발생합니다 서명됩니다.
정확성 문제는 일반적으로 Python 코드에서 적어도 한 번 register &= all_ones
이 필요합니다. 최소한의 올바른 마스킹을 결정하기 위해서는 세심한 분석이 필요합니다.
int
대신 long
에서 작업하는 것이 효율성을 크게 향상시키지 않습니다. 32 비트 all_ones가 long
이기 때문에 32 비트 알고리즘은 0
의 입력에서도 long
답변을 반환한다는 것을 알 수 있습니다.
파이썬은 해석이 빠르며 C로 빠르게 (비트 해킹이 빠른 기계 명령어로 컴파일되는) 파이썬에서 빠를 필요는 없습니다. 나중에 프로파일하는 것을 잊지 마십시오. –
http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – telliott99
성능이 중요한 경우 Python 바인딩이있는 C에서 .dll/.so를 작성하는 것이 좋습니다 :) – badp