19 votos

¿Hay alguna forma de usar medias bits?

Como la mayoría de la gente aquí sabe, utilizando 4 bits, podemos contar de 0 a 15 (0123456789ABCDEF en hexadecimal). Pero si solo contáramos hasta 9, todavía estaríamos usando 4 bits, y los dígitos de la A a la F se desperdiciarían.

Sin embargo, la página de Código QR de Wikipedia afirma que al utilizar solo dígitos numéricos del 0 al 9 se utilizan 3 bits por carácter, lo cual es correcto desde un punto de vista estadístico. Y aún así un tercio de un bit no es un objeto físico, y enviar un número del 0 al 9 utiliza al menos 4 bits según tengo entendido.

¿Hay alguna manera de utilizar las combinaciones desperdiciadas para enviar un carácter con fracciones de bits de manera efectiva?

De acuerdo, permíteme dar un ejemplo: Los dos dígitos "27" deben ser enviados. Con técnicas normales de codificación, los bits enviados serían 00100111. Podríamos entonces imaginar un sistema que reemplazaría el dígito '2' por el dígito 'E' o 'F', dependiendo del siguiente bit; en este caso, el siguiente bit es 0, por lo que el '2' se reemplaza por 'E'. La cadena de bits resultante sería entonces 11010111. Por otro lado, si los dígitos "28" deben ser enviados, el primer bit después del '2' es un 1, por lo que se reemplaza por el dígito 'F' en su lugar, dando como resultado la cadena 11111000.

En ambos casos, se ha logrado una economía de 1 bit, porque un nibble se utilizó para dos caracteres diferentes. En otras palabras, se utilizan tres y medio bits en cada carácter.

2 votos

Para obtener una perspectiva diferente sobre el empaquetamiento de valores en un espacio de dígitos más pequeño, echa un vistazo a las computadoras ternarias (es.wikipedia.org/wiki/Computadora_ternaria). ¡Si es lo suficientemente bueno para Knuth, es lo suficientemente bueno para mí!

3 votos

Mejor aún es reconocer que puedes calcular (10 * primer_dígito) + segundo_dígito y codificarlo en 7 bits, representando 0...99, con los códigos 100-127 reservados para otras cosas. Y hay aún más ahorros con 3 dígitos comprimidos en 10 bits.

0 votos

Para enviar los 100 valores diferentes por separado, lo mejor que puedes obtener es empaquetarlos en 7 bits. Si tienes más dígitos, el empaquetado será más eficiente. Si tienes menos de 64 valores para enviar, puedes hacerlo usando solo 6 bits.

22voto

GetFree Puntos 495

No se puede enviar medio bit, pero se pueden empaquetar efectivamente dos medias bits en un bit antes de la transmisión o almacenamiento.

Tú mismo das un ejemplo, así que efectivamente has respondido a tu propia pregunta con un SÍ.

Una forma quizás un poco más sencilla es codificar simplemente el valor de dos dígitos decimales en 7 bits. (Una especie de codificación binaria de doble decimal).

1 votos

Un caso de uso interesante para empaquetar pares de dígitos en siete bits es al transmitir archivos ASCII que consisten principalmente en datos numéricos. Cualquier valor de byte por debajo de 128 representa un único carácter ASCII, mientras que 128-227 representan dos dígitos ASCII. Fácil de codificar o decodificar, y no requiere que los datos contengan principalmente dígitos (o incluso algún dígito), pero puede comprimir cadenas de dígitos fácilmente en un 50%.

0 votos

O ese formato PDP11 que empacaba 3 caracteres alfanuméricos en 16 bits con un bit de sobra...

0 votos

@BrianDrummond: Se podrían usar 16 bits para almacenar exactamente tres caracteres de un conjunto de 40, o hasta tres de un conjunto de 39, pero no habría un bit de repuesto. Normalmente "alphanumeric" implicaría un conjunto de al menos 36, pero la única forma en que habría un bit extra sería si el conjunto estuviera limitado a 32.

19voto

markg Puntos 363

Puedes usar codificación Huffman para que los números tengan longitudes de bits variables. Si conoces un dígito que ocurrirá más a menudo que los demás, te ayudará.

ejemplo (con ocurrencia igual):

0 - 1111

1 - 1110

2 - 110

3 - 101

4 - 100

5 - 011

6 - 010

7 - 001

8 - 000

ejemplo en el extremo receptor para obtener el número 1:

El primer bit entra y deja solo las opciones de 0 a 4.

El segundo bit entra y deja solo las opciones de 0 a 2.

El tercer bit entra y deja las opciones de 0 a 1.

El cuarto bit entra y el número entrante es 1.

12voto

Robert P Puntos 10807

Tal vez lo que estás buscando es la Codificación Aritmética, que puede codificar eficientemente una cadena de símbolos, cada uno de los cuales en principio podría requerir un número fraccional (no entero) de bits. (aunque el mensaje total debe ser un número entero de bits)

Citando Wikipedia:

La codificación aritmética difiere de otras formas de codificación de entropía como la codificación Huffman en que en lugar de separar la entrada en símbolos individuales y reemplazar cada uno con un código, la codificación aritmética codifica el mensaje completo en un solo número, una fracción n donde (0.0 ≤ n < 1.0).

10voto

TEMLIB Puntos 1200

El nuevo IEEE P754 para aritmética de punto flotante ahora define formatos decimales además de binarios. Uno de los códigos propone agrupar dígitos decimales en conjuntos de 3 en 10 bits.

codificar de 0 a 999 usando 10 bits = 1024 códigos posibles es bastante eficiente, y los dígitos decimales a menudo se agrupan de tres de todas formas.

Decimal Densamente Empaquetado : http://en.wikipedia.org/wiki/Densely_packed_decimal

0 votos

Aunque los dígitos decimales se agrupen de tres en tres, la semántica correcta de punto flotante decimal puede requerir que (1) escalar una mantisa por un múltiplo no divisible por tres de diez requiera multiplicar o dividir todos los componentes por 10 o 100; (2) algunos bits pueden ser utilizados para ya sea la porción superior o inferior del número, dependiendo de (exponente mod 3); (3) Si el exponente se almacena en base-1000, entonces el grupo inferior de tres dígitos a veces puede tener que ser redondeado al 10 o al 100 más cercano, en lugar de a la unidad más cercana.

0 votos

Personalmente creo que tipos como BigDecimal serían, para muchos propósitos, más eficientes si cada palabra tuviera 9 dígitos decimales en lugar de 32 bits, pero los comportamientos de redondeo no deberían verse afectados por el agrupamiento de dígitos.

4voto

user13107 Puntos 313

Una correspondencia 1:1 de binario (o hexadecimal) es solo una codificación de un símbolo para bits. Así que sí, como lo mostraste, es posible. Otro lugar donde se utiliza esto es (pero ligeramente diferente) en la codificación/descodificación de tramas en sistemas de comunicación en los que las transiciones de bits se mantienen más alejadas para facilitar la descodificación. Y, por supuesto, la codificación 8b/10b y 64b/66b, etc., etc., es una idea similar, en la que un espacio de símbolos más pequeño se codifica en un espacio ligeramente redundante más grande para obtener equilibrio DC, separación de símbolos y códigos de control en subbandas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X