Tại sao kích thước bộ đệm vòng phải là công suất 2?Tại sao kích thước bộ đệm vòng phải là công suất 2?
Trả lời
Nó phải là sức mạnh của 2 để sử dụng cách tiếp cận được nêu chi tiết bên dưới. Nó không cần phải khác.
Cách tiếp cận chung trông giống như "if (index> = size) {index = size - index;}" (kích thước 10, chỉ mục 10, kết quả là 0). Điều này là chậm hơn và dễ bị lỗi liên quan đến cách tiếp cận sau đây.
Sử dụng một sức mạnh của hai phép chúng tôi tận dụng những điều sau đây:
size = 32
bin(size) => '00100000'
mask = size - 1;
bin(mask) => '00011111'
Áp dụng mặt nạ này với một Bitwise và, chúng ta có thể cô lập chỉ các bit mà bao gồm các số trong phạm vi 0-31 như chỉ mục tăng:
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)
Cách tiếp cận này không yêu cầu so sánh, không có nhánh và an toàn (kết quả luôn nằm trong giới hạn). Nó có thêm lợi ích của việc không truy tìm thông tin; trong khi chỉ số 65 giải quyết phần tử 1, tôi vẫn giữ lại thông tin rằng chỉ mục là hợp lý 65 (điều này chứng minh khá hữu ích).
Tôi cũng muốn nói thêm rằng đây là giống như hiệu quả khi chỉ số phát triển đến 3.456.237 (địa chỉ 13 trong bộ đệm) như khi nó 3.
Tôi biết tôi là muộn để đảng, tôi thậm chí không chắc chắn làm thế nào tôi tìm thấy câu hỏi này :-) Hy vọng điều này sẽ giúp.
- 1. Tại sao kích thước bộ đệm mặc định là 8k trong Java IO?
- 2. Tại sao bộ đệm kích thước cố định (mảng) phải không an toàn?
- 3. Tại sao bộ đệm ứng dụng của tôi không phải là bộ đệm log4?
- 4. Kích thước bộ đệm trong BufferedReader là gì?
- 5. BufferedReader mặc định kích thước bộ đệm?
- 6. Kích thước tối đa của bộ đệm Node.js là gì
- 7. Golang - Kích thước bộ đệm kênh là gì?
- 8. Tại sao "Kích thước bộ nhớ được phép cạn kiệt"?
- 9. tràn bộ đệm kích thước dbms_output
- 10. Tại sao sizeof (param_array) là kích thước của con trỏ?
- 11. Android - Kích thước bộ đệm MediaPlayer trong ICS 4.0
- 12. động có kích thước tăng :: ASIO :: đệm
- 13. Tại sao kích thước của một lớp trống trong C++ không phải là 0?
- 14. Tại sao kích thước không phải là đối số mẫu của std :: initializer_list?
- 15. boost :: asio :: buffer: Lấy kích thước bộ đệm và ngăn chặn tràn bộ đệm?
- 16. chuyển bộ đệm char sang các chức năng và nhận kích thước của bộ đệm
- 17. Tăng kích thước bộ đệm SPI trong Raspbian
- 18. AudioQueue cắt tỉa và kích thước bộ đệm
- 19. Cách tìm kích thước bộ đệm ổ cắm của linux
- 20. Kích thước bộ đệm tối ưu của Android
- 21. Tách HTML HTML: giới hạn kích thước cho bộ đệm
- 22. Bộ đệm giao thức của Google - Bộ đệm kích thước cố định?
- 23. Emacs kích thước bộ đệm tối đa ansi-hạn?
- 24. Tại sao tôi nên thực hiện đệm đôi thủ công?
- 25. OpenCL - Tại sao sử dụng bộ đệm READ_ONLY hoặc WRITE_ONLY
- 26. kích thước bộ đệm thích hợp cho chức năng 'ghi' là gì?
- 27. Kích thước đọc tệp đệm tối ưu?
- 28. Tại sao gọi mmap() với kích thước lớn không thành công?
- 29. Kích thước bộ đệm để tạo tệp nén .zip bằng Java là gì?
- 30. Tại sao 2 /// 2 là 2 trong Javascript?
Điều gì khiến bạn chắc chắn nó phải là sức mạnh của hai? –