¿Por qué debe un tamaño de búfer de anillo ser una potencia de 2?¿Por qué un tamaño de búfer de anillo debe tener una potencia de 2?
Respuesta
Debe ser una potencia de 2 para utilizar el enfoque que se detalla a continuación. No es necesario que sea de otra manera.
Un enfoque común parece "if (index> = size) {index = size - index;}" (tamaño de 10, índice 10, índice resultante es 0). Esto es más lento y propenso a errores en relación con el siguiente enfoque.
Usando una potencia de dos nos permite tomar ventaja de los siguientes:
size = 32
bin(size) => '00100000'
mask = size - 1;
bin(mask) => '00011111'
La aplicación de esta máscara con un nivel de bits y, podemos aislar sólo los bits que componen los números en el rango de 0 - 31 como el índice crece:
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)
Este enfoque requiere ninguna comparación, no hay ramas, y es seguro (índice resultante siempre dentro de ciertos límites). Tiene el beneficio adicional de no destruir la información; mientras que el índice 65 aborda el elemento 1, aún conservo la información de que el índice es lógicamente 65 (lo que resulta bastante útil).
También me gustaría añadir que esto es tan eficiente cuando el índice crece a 3.456.237 (dirección 13 en el búfer) como cuando es 3.
Sé que llego tarde a la fiesta, Ni siquiera estoy seguro de cómo encontré esta pregunta :-) Espero que esto ayude.
- 1. ¿Por qué un búfer de tamaño fijo (matrices) debe ser inseguro?
- 2. Potencia anterior de 2
- 3. imagen no es una potencia de 2?
- 4. División eficaz de un doble con una potencia de 2
- 5. ¿Por qué las imágenes para texturas en el iPhone deben tener una potencia de dos dimensiones?
- 6. Encontrar si un número es una potencia de 2
- 7. Objeto nullable debe tener un valor - ¿por qué?
- 8. Buscando la derecha aplicación búfer de anillo en C
- 9. Cálculo del tamaño de un sprintf() búfer
- 10. buffer de anillo con numpy/ctypes
- 11. ¿Qué es un cierre de potencia completa?
- 12. ¿Por qué mi equipo de desarrollo debe tener un servidor de compilación?
- 13. ¿Por qué la lista ordenada debe tener un par de valores clave?
- 14. ¿Por qué debe una propiedad de implementación en VB.NET tener especificadores 'ReadOnly' que coincidan?
- 15. Tabla hash: ¿por qué el tamaño debe ser primordial?
- 16. ¿Qué tipo debe tener Struts ActionForm?
- 17. ¿Qué valor debe tener el servicio Nombreprincipal?
- 18. ¿Qué permisos de archivos debe tener el contenido de $ GIT_DIR?
- 19. ¿Por qué Fabric throw 'TypeError: argumento debe ser un int, o tener un método fileno()'?
- 20. Establecer tamaño de búfer de tubería
- 21. operador de sobrecarga == quejándose de 'debe tener exactamente un argumento'
- 22. ¿Qué características debe tener un analizador C# /. NET?
- 23. ¿Qué prácticas de codificación OOP siempre debe tener en cuenta?
- 24. executeFetchRequest: error: Una solicitud de búsqueda debe tener una entidad
- 25. ¿Debe tener extensiones Emacs?
- 26. ¿Por qué se define este búfer dentro de un bucle?
- 27. Mod de potencia 2 en operadores bit a bit?
- 28. AJAX: ¿qué tipo de contenido debe tener datos codificados JSON?
- 29. ¿Por qué no debe tener acceso a un miembro compartido/estático a través de una variable de instancia?
- 30. Estableciendo un tamaño de búfer más pequeño para sys.stdin?
¿Qué te hace estar tan seguro de que tiene que ser una potencia de dos? –