왜 링 버퍼 크기가 2의 거듭 제곱이어야합니까?왜 링 버퍼 크기가 2의 거듭 제곱이어야합니까?
6
A
답변
22
아래에 설명 된 방법을 사용하려면 2의 거듭 제곱이어야합니다. 그렇지 않아도됩니다.
일반적인 접근 방식은 "if (index> = size) {index = size - index;}"와 같습니다 (크기 10, 색인 10, 결과 색인은 0 임). 이것은 다음과 같은 접근법에 비해 느리고 오류가 발생하기 쉽습니다. - 31로
size = 32
bin(size) => '00100000'
mask = size - 1;
bin(mask) => '00011111'
비트 단위로이 마스크를 적용하고, 우리는 0의 범위에 숫자를 포함하는 경우에만 비트를 분리 할 수 있습니다 : 2의 거듭 제곱을 사용하여
는우리는 다음을 활용할 수 색인은 다음과 같이 커집니다.
index = 4
bin(4 & mask) => '00000100' (4)
# index 32 wraps. note here that we do no bounds checking,
# no manipulation of the index is necessary. we can simply
# and safely use the result.
index = 32
bin(index & mask) => '00000000' (0)
index = 33
bin(index & mask) => '00000001' (1)
index = 64
bin(index & mask) => '00000000' (0)
index = 65
bin(index & mask) => '00000001' (1)
이 접근 방식은 비교가 필요없고 분기가없고 안전합니다 (결과 색인은 항상 범위 내입니다). 정보를 삭제하지 않는 이점이 있습니다. 인덱스 65는 엘리먼트 1을 다루지 만, 나는 여전히 인덱스가 논리적으로 65라는 정보를 가지고있다.
나는 또한 인덱스 (버퍼에 주소 13) 3456237로 성장 때 나는 파티에 늦었을 알고 3.
을 때 같이 이것은 단지 효율적입니다 추가 할, 나는 '이 질문을 어떻게 발견했는지 모르겠다. :-) 희망이 도움이된다.
관련 문제
- 1. opencv dft는 2의 거듭 제곱으로 이미지 크기가 올바르게 작동합니다.
- 2. 우리는 항상 상수를 2의 거듭 제곱으로 선언합니까? 우리가 왜
- 3. 안드로이드에서 클래스 AudioTrack을 2의 거듭 제곱 인 버퍼 크기로 사용해 보셨습니까?
- 4. 왜 버퍼 크기가 스트림 출력을 변경합니까?
- 5. Recv 링 버퍼 대 간단한 버퍼
- 6. 샘플 크기가 2의 거듭 제곱이 아닌 비트 맵을 디코딩하는 방법은 무엇입니까?
- 7. 우선 순위 반전이없는 링 버퍼
- 8. 텍스처를 한 파일에 넣는 법 (2의 거듭 제곱)
- 9. Numpy (Python)에서 FFT가 2의 거듭 제곱이 아닐 때
- 10. 무엇이 비트 OR 및 AND에 대해 2의 거듭 제곱을 사용합니까?
- 11. iPhone에서 텍스처의 이미지가 2의 2의 비중이어야하는 이유는 무엇입니까?
- 12. 버퍼 크기가 작은 XAudio2 지연
- 13. 왜 boost :: asio :: read 버퍼 데이터 크기가 읽기 크기보다 작습니까?
- 14. stdout에 버퍼 크기가 첨부되어 있습니까?
- 15. EditText를위한 최대 버퍼 크기가 있습니까?
- 16. Socket.Send 버퍼 크기가 제한되어 있습니까?
- 17. 원형/링 버퍼 용 npm 호스트 라이브러리
- 18. C에서 순환리스트 (링 버퍼)를 어떻게 구현합니까?
- 19. iOS, 오디오 대기열 : 버퍼 크기가 맞지 않습니다.
- 20. 동그라미 안에 서클 링, 동적으로 크기가
- 21. MongoDB의 크기가 왜 폭발적입니까?
- 22. matlab : 구조체 버퍼 크기가 4096보다 큽니까?
- 23. 컬 메모리 버퍼 크기가 너무 작습니다.
- 24. .NET Rx - ReplaySubject 버퍼 크기가 작동하지 않습니다.
- 25. HxW 길이가 2의 거듭 제곱이 아닐 때 어떻게 cocos2d에서 배경을 반복 할 수 있습니까?
- 26. OpenCL 하위 버퍼, 왜 중요합니까?
- 27. Java IO에서 기본 버퍼 크기가 8k 인 이유는 무엇입니까?
- 28. 왜 이미지 크기가 조정되지 않습니까?
- 29. 왜 HeapOverflow 프로그램의 크기가 5MB입니까?
- 30. LWJGL에서 2의 힘이 아닌 텍스처는 어떻게 사용합니까?
2의 거듭 제성이 무엇이 그렇게 확신할까요? –