¿La potencia de dos bits por palabra es "conveniente"? Si es así, ¿por qué es eso?

11

Encuentro varias fuentes que afirman que la potencia de dos bits en una palabra binaria (como 8 bits por byte) es "buena" o "conveniente". No encuentro ninguna fuente que indique por qué.

De Cuál es la historia de por qué bytes son ocho bits? leemos en la respuesta aprobada:

Las computadoras binarias motivan a los diseñadores a hacer potencias de dos tamaños.

¿Está bien, pero por qué? En la misma pregunta pero en el campo de comentarios para la pregunta, encuentro:

¿Es la última oración en broma? Un byte de 12 bits sería inconveniente porque no es una potencia de 2. - robjb

Nuevamente, sin fundamento ...

los cálculos de direcciones son mucho más simples con potencias de 2, y eso cuenta cuando estás haciendo lógica con transistores sin procesar en pequeñas latas - Mike

Como los bytes son la unidad direccionable más pequeña, esto no tiene mucho sentido. Sin embargo, hay muchos votos a favor en el comentario. Tal vez me perdí algo.

De Wikipedia :

El estándar de facto de ocho bits es una potencia conveniente de dos que permite los valores de 0 a 255 para un byte

¿Y esto sería conveniente porque ...?

Para aclarar, se trata del número de bits por byte (por ejemplo, 8 o 6, etc.), no del número de valores por byte (por ejemplo, 2 8 o 2 6 , etc.). Debido a la confusión, también señalo que no se trata de tamaños de palabras.

No estoy demasiado interesado en razones históricas. Esos han sido bien explicados en otros lugares (ver enlaces).


Pregunta relacionada sobre SO: /programming/1606827/why-is-number-of-bits-always-a-power-of-two

Andreas
fuente
2
@gnat Estoy bastante seguro de que estamos hablando del número de bits por byte (es decir, 8 en un byte de 8 bits) aquí, no del número de valores que puede representar un byte (es decir, 2 ^ 8 en un byte de 8 bits). Entonces, si tiene, por ejemplo, un byte de 6 bits, 6 no es una potencia de dos , pero sí, un byte de 6 bits puede representar una potencia de dos números de valores.
8bittree
2
@ 8bittree Creo que lo tengo, ¡gracias por explicarlo! (voto duplicado retraído, aunque creo que sería más fácil para los lectores si una explicación como en su último comentario se editara en la pregunta, esto parece bastante sutil)
mosquito
2
Pregunta similar sobre SO: stackoverflow.com/q/1606827/3723423 - la respuesta trae algunos argumentos plausibles sobre conveniencia
Christophe
2
@Snowman: La publicación del OP contiene una falacia de "mendigar la pregunta": "¿Por qué los poderes de dos se consideran tamaños de bytes convenientes?" No lo son No tiene nada que ver con poderes de dos; leyó mal la oración en el artículo de Wikipedia.
Robert Harvey
3
@RobertHarvey En la respuesta a "¿Cuál es el historial de por qué los bytes son ocho bits?" (también vinculado en mi pregunta) está la siguiente oración: "Las computadoras binarias motivan a los diseñadores a hacer potencias de dos". ¿También leí mal esto? ¿Qué significan ambas fuentes en su opinión? Solo decir "te equivocaste" en realidad no lo está haciendo por mí.
Andreas

Respuestas:

10

No creo que los bytes de 8 bits hayan tenido éxito porque tienen un ancho que es una potencia de dos. Si no desea abordar bits individualmente, y esa es una característica común ni ahora ni en el pasado, tener un poder de dos no tiene una importancia práctica real (es solo que ahora es mucho más que en el pasado cuando se ahorra algunos componentes discretos eran importantes: un reflejo para los ingenieros de hardware y software y permanecer en un terreno familiar es importante para otros fines), y no recuerdo haberlo mencionado en mi historial de lecturas informáticas (1). Se necesitaban minúsculas, eso significaba algo más que los juegos de caracteres dominantes de 6 bits. El ASCII era de 7 bits, pero el ASCII era puramente para el intercambio (y por lo tanto se traduciría al código interno para su manejo), y por lo tanto

El Subcomité reconoce que es poco probable que el fabricante de computadoras diseñe computadoras que usen códigos de 7 bits internamente. Es más probable que usen códigos de 4 bits, 6 bits y 8 bits. Actualmente, no existe una necesidad generalizada de intercambiar más de 128 caracteres separados y distintos entre computadoras, y entre computadoras y equipos de entrada / salida asociados. [la cinta de papel, que tenía un tamaño de trama natural de 8 bits pero necesitaba paridad por lo que la carga útil de un marco era de 7 bits también se cita a favor del carácter de 7 bits para ASCII, la potencia de dos no se cita entre las ventajas de 8 bits ] (2)

y para el hardware, el byte de 8 bits ganó porque permitió empaquetar 2 dígitos decimales en un byte en un momento en que el 75% de los datos era numérico y estaba representado en BCD (3).

(1) por ejemplo Blaauw y Brooks, Computer Architecture ; MacKenzie, Conjuntos de caracteres codificados, Historia y Desarrollo tienen una discusión sobre ese tema.

(3) Documento de X3.2 - el Subcomité responsable de ASCII - citado por MacKenzie.

(3) MacKenzie, otra vez.

Un programador
fuente
1
Gracias. Su respuesta es acertada y trajo referencias. Tienes mi voto Sin embargo, me doy cuenta de que si lo que dices es cierto, también es imposible de probar. No se puede demostrar la inexistencia de algo. Supongo que realmente debería interactuar con los que dicen "conveniencia" y verificar sus fuentes. Tal vez es solo un rumor generalizado.
Andreas
El otro factor de conveniencia es que un byte se puede representar fácilmente como dos valores hexadecimales. Poner dos decimales codificados binarios (BCD) en un byte se conoce más comúnmente como decimal empaquetado. Esto se consideró conveniente porque los decimales se pueden leer como decimales cuando los datos se muestran en hexadecimal.
JimmyJames
Los bytes de 12 bits se pueden representar fácilmente como tres valores hexadecimales. Y puede almacenar tres números BCD en un byte de 12 bits. Seguramente eso es mucho mejor que dos valores hexadecimales y dos números BCD. En realidad, un byte de 10 bits puede contener tres dígitos decimales. Y creo que así es como funciona el estándar de coma flotante decimal IEEE.
gnasher729
1
@JimmyJames, creo que obtienes la causalidad revertida con hexadecimal. El hexadecimal se hizo popular porque era una forma compacta de representar bytes de 8 bits, anteriormente octal era mucho más popular (y era más popular en una máquina como el PDP-11 que tenía bytes de 8 bits pero donde los campos de 3 bits eran significativos en la codificación del conjunto de instrucciones).
Programador
@ gnasher729, el byte de 8 bits es hijo de los años 60. Pasar de char de 6 bits a char de 12 bits era impensable en los años 60. Incluso hoy, cuando estamos mucho menos limitados, UTF-8 es popular porque UTF-16 se considera demasiado derrochador. Un byte de 10 bits era casi impensable y la codificación de 10 bits por 3 dígitos decimales tampoco es totalmente práctica cuando se examinan valores en registros y en memoria con un panel frontal sin hablar sobre el impacto en la implementación con la tecnología de la época.
Programador
2

Aparte del accidente histórico, no hay una razón particular por la que debamos usar 8/16/32/64 bits. Supongo que 12/24/48/96 bit realmente sería más útil.

Para manejar texto, Unicode usando un hipotético UTF-24 sería más barato que UTF32; el hipotético UTF-12 almacenaría todos los caracteres UTF-8 de byte único y doble en 12 bits, y todos los caracteres UTF-8 de triple y cuádruple byte en 24 bits (el rango se reduciría ligeramente a 2 ^ 20 caracteres, pero eso es todavía cuatro veces más de lo que se usa generosamente); el código sería más simple porque solo hay dos variantes.

Para coma flotante, 48 bits suele ser suficiente. 96 bit es sustancialmente mejor que 80 bit extendido. 24 bits es útil para gráficos; mucho más útil que el 16 bit soportado por algunas tarjetas gráficas. Los punteros de 48 bits pueden manejar 256 terabytes.

La única desventaja son las matrices de bits, donde se necesita una división por 12 para calcular las posiciones de los bytes. Si eso se considera importante, estoy seguro de que la división por 12 se puede implementar de manera bastante eficiente en el hardware.

gnasher729
fuente
Punto interesante sobre UTF, aunque está ligeramente fuera de tema. El tamaño de byte (o bit) de punto flotante es una batalla interminable entre memoria y precisión en la que solo tienes que vivir con uno u otro. Buen punto sobre las matrices de bits también.
Andreas
1
Pensamientos interesantes, pero no estoy seguro de que esto responda la pregunta.
1
La pregunta era: "¿Por qué ocho bits se considera conveniente"? Seguramente decir "no lo es" responde la pregunta.
gnasher729
1
@ gnasher729 La pregunta era: "¿Por qué se considera conveniente la potencia de dos bits por byte?", aunque su respuesta parece aplicarse también.
8bittree
2
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Yannis
2

Esto es conveniente debido a las arquitecturas de hardware comunes que utilizan múltiplos de 8, por ejemplo, arquitecturas de 32 bits y 64 bits. Esto significa una mayor eficiencia cuando se utiliza el almacenamiento y la transmisión de datos de 8 bits.

"Sin embargo, las consideraciones de economía en el diseño impulsan fuertemente un tamaño, o unos pocos tamaños relacionados por múltiplos o fracciones (submúltiplos) a un tamaño primario. Ese tamaño preferido se convierte en el tamaño de la palabra de la arquitectura".

Word (arquitectura de computadora)

Ver también: ¿Cuál es el historial de por qué los bytes son ocho bits?

Brad Thomas
fuente
55
No aceptaré esto como respuesta. Mi pregunta es por qué el poder de dos es conveniente, no por qué el estándar de facto es de 8 bits. Y la historia detrás de 8 bits menciona que 5, 6 y 7 bits se usan por razones reales, mientras que pasar de 7 a 8 está motivado con un "meh, por qué no". Tuve la sensación de que leer diferentes fuentes de poder de dos tenía más que compatibilidad con los sistemas actuales. (En realidad, los 8 bits dieron paridad a los juegos de caracteres de 7 bits). Word es una cosa diferente en la que obtengo el beneficio de los tamaños de potencia de dos, es decir, se puede usar shift en lugar de mult en los cálculos.
Andreas
3
@RobertHarvey Esta pregunta no se trata del número de estados por interruptor (es decir, binario versus trinario o más), se trata de cuántos interruptores se agrupan. Vea mi edición de la pregunta.
8bittree
2
En cuanto a su edición, no existe una distinción significativa entre el número de bits por byte y el número de valores por byte. Son dos formas de expresar lo mismo. El número de valores que puede contener un byte se deduce directamente del número de bits que contiene: un byte tiene 8 bits, por lo que puede contener valores de hasta 2⁸-1.
Robert Harvey
2
Lógicamente, se deduce que elige un tamaño para el byte que puede contener un rango numérico que sea conveniente. ASCII es de 7 bits porque proporciona 128 valores diferentes, suficientes para codificar ambos casos del alfabeto romano, caracteres numéricos, signos de puntuación, caracteres de control y varios caracteres especiales. Un byte puede contener 7 bits ASCII y un bit de paridad para la verificación de errores, para un total de 8 bits, adecuados para un teletipo. Hemos estado usando ese tamaño por un byte desde entonces.
Robert Harvey
2
@JeremyKato Los dispositivos que mencioné son más antiguos (era de los años 60 y 80, en su mayor parte), por lo que probablemente no esté familiarizado con ellos. ASCII, en realidad es una codificación de 7 bits (la paridad no es parte del estándar). Pero para la parte principal de tu comentario, no, no me falta nada. Entiendo que hay razones por las que 8 bits específicamente es conveniente, lo que usted y Robert Harvey se están perdiendo es que la pregunta es acerca de los poderes de 2 bits en general , no específicamente de 8 bits.
8bittree
1

Según el artículo de Wikipedia para Word , esto hace que los cálculos relacionados con la memoria de direccionamiento sean significativamente más fáciles:

Se utilizan diferentes cantidades de memoria para almacenar valores de datos con diferentes grados de precisión. Los tamaños de uso común suelen ser una potencia de dos múltiplos de la unidad de resolución de la dirección (byte o palabra). La conversión del índice de un elemento en una matriz a la dirección del elemento requiere solo una operación de cambio en lugar de una multiplicación. En algunos casos, esta relación también puede evitar el uso de operaciones de división. Como resultado, la mayoría de los diseños de computadora modernos tienen tamaños de palabras (y otros tamaños de operandos) que son dos veces más grandes que un byte.

vartec
fuente
2
Sí, potencia de dos veces el tamaño de un byte. No hay una razón inherente por la cual un byte debe ser de ocho bits y no nueve, doce o quince.
gnasher729
@ gnasher729, mucho más fácil dividir por 8 (o 16 o 32 o 64) que dividir por 9 o 12 o 15.
robert bristow-johnson
@ gnasher729 si la palabra es potencia de 2 bits y potencia de 2 bytes, esto implica que el byte tiene que ser potencia de 2 bits
vartec
@vartec El artículo y la cita dicen: "Los tamaños de uso común suelen ser una potencia de dos múltiplos de la unidad de resolución de la dirección (byte o palabra)" y "la mayoría de los diseños de computadora modernos tienen tamaños de palabras (y otros tamaños de operandos) que son una potencia de dos veces el tamaño de un byte ". Leí que el "tamaño de palabra" se mide en bytes, no en bits. No hay una regla sobre el tamaño de palabra en bits que es o debe ser potencia de 2 en el artículo.
Andreas
@vartec: SI. Obviamente, nadie construiría una máquina con palabras de 32 bits y bytes de 12 bits. Pero nada habla en contra de una máquina con palabras de 48 o 96 bits y bytes de 12 bits. Y ha habido máquinas donde una palabra tenía diez bytes.
gnasher729
0

Está estrechamente relacionado con el espacio de direcciones. Al agregar un poco más a su bus de direcciones, puede direccionar el doble de ubicaciones de memoria. Entonces, cuando agrega esa línea adicional, también podría usarla en toda su extensión.

Esto conduce a una progresión natural de 1, 2, 4, 8, 16, 32, etc.

A nivel técnico de producción, también es fácil repetir el mismo patrón litográfico. Es decir, duplicarlo. Si comienza con un pestillo y luego duplica el patrón, pasará 8, no 6, 10 o 12.

Martin Maat
fuente
1
¿Cómo se relaciona eso con el número de bits en un byte? ¿Está afirmando seriamente que un AND lógico de 32 bits es más fácil de implementar que 36 o 28 bits?
gnasher729
1
No hice tal reclamo. Mi sugerencia es que proviene de diseños anteriores que se ampliaron progresivamente en ancho a medida que los transistores se volvieron más baratos y los circuitos integrados permitieron circuitos más pequeños.
Martin Maat
1
Teoría interesante sobre el nivel técnico de producción. Puede que tengas algo. ¿Podría extender el párrafo o tal vez proporcionar un enlace que explique los conceptos básicos?
Andreas
1
No tiene sentido. Por ejemplo, en una tarjeta gráfica donde se necesitan todo tipo de tamaños de bits impares en varios lugares, todo se hace exactamente con el tamaño requerido, y ni un poco más. Si un decodificador h.264 necesita una precisión de 19 bits para alguna operación, entonces el hardware implementa 19 bits y no 20, 24 o 32. Y disculpe, no manipula patrones litográficos. Usted define el hardware y luego lo ejecuta a través de algún software que crea el diseño.
gnasher729
1
@MartinMaat: Confunde marketing + estandarización con razones tecnológicas. Y la tecnología es lo que estamos discutiendo.
gnasher729
0

No siempre son los anchos de palabra una potencia de dos. Recientemente he estado haciendo algo de codificación en un DSP SHArC que tiene un ancho de palabra de 32 bits para los números, pero no para los códigos de operación (que tienen 48 bits de ancho).

Probablemente, la razón por la cual los anchos de palabra son una potencia de dos es debido a algunas instrucciones que prueban (o establecen o borran o alternan) un solo bit o cambian (o rotan) hacia la izquierda o hacia la derecha en un número específico de bits. Hay un campo de bits en el código de operación para especificar la ubicación del bit único o el número de bits a cambiar. Si el ancho de la palabra es una potencia de dos, este campo de bit requiere bits de registro 2 (word_width) para cubrir la palabra completa. Es decir, una palabra que tiene 32 bits de ancho necesita un campo de 5 bits en el código de operación para estas operaciones. Si la palabra tenía 33 bits de ancho, necesitaría 6, de lo contrario no podría cubrir la palabra completa, pero ese también sería el caso si la palabra tuviera 64 bits de ancho.

Los bits en un código de operación son extremadamente valiosos, por lo que generalmente no quieren desperdiciarlos. Entonces tiene sentido hacer que la palabra tenga una potencia de 2 de ancho.

La razón por la que los bytes tienen 8 bits de ancho es que es la potencia más pequeña de dos que puede contener un carácter ASCII (que es de 7 bits).

robert bristow-johnson
fuente
Esta no es mi área de especialización, pero parece una razón válida para el poder de dos bytes Y tamaños de palabra. Me imagino que también debes preocuparte menos por UB. Para un cambio de 33 bits requeriría un código de operación de 6 bits, pero solo aproximadamente la mitad de los valores posibles (0-32) tienen un significado útil. ¿Estarías de acuerdo?
Andreas
el código de operación debe ser más ancho que el campo de bits necesario para el recuento de turnos. un byte no es otra cosa que una palabra de 8 bits. La razón por la cual el hardware de la computadora tiende a usar tamaños de palabra que son 8 o 16 o 32 o 64 bits (no siempre es el caso, el antiguo DSP56000 tenía palabras de 24 bits) es por las razones que di anteriormente y la razón dada por vartec : dado un mapa de bits de palabras empaquetadas y se le da un número de fila y columna de un píxel en particular, uno tiene que dividir el número de columna por el ancho de la palabra para saber a qué palabra acceder para probar o cambiar el píxel. dividir por una potencia de 2 es fácil.
Robert Bristow-Johnson
¿Qué es un "mapa de bits de palabras empaquetadas"? ¿HighColor se ajusta a esa descripción?
Andreas
@ robertbristow-johnson: falta total de imaginación. Con bytes de 9 bits, usaríamos palabras de 36 bits, 130 millones de colores en lugar de 16 millones de colores en RGBA, RGB666 en lugar de RGB555 o la monstruosidad RGB565 para un color de baja calidad, y todo estaría bien. Y ASCII incluiría 512 caracteres hasta Latin Extended.
gnasher729
@Andreas, no, quise decir dos "colores". totalmente blanco o totalmente negro.
Robert Bristow-Johnson