Mis compañeros de trabajo y yo hemos estado empeñados en descubrir por qué alguien haría todo lo posible por programar números en una base que no sea la base 10.
Sugerí que quizás podría optimizar ecuaciones más largas colocando las variables en la base correcta con la que está trabajando (por ejemplo, si solo tiene conjuntos de 5 de algo sin restos, podría usar la base 5), pero no estoy seguro si eso es verdad
¿Alguna idea?
Respuestas:
La razón habitual para escribir números, en código, en otra base que no sea la base 10, es porque estás jugando un poco.
Para elegir un ejemplo en C (porque si C es bueno para cualquier cosa, es bueno para el bit-twiddling), digamos que un formato de bajo nivel codifica un número de 2 bits y un número de 6 bits en un byte
xx yyyyyy
:produce
En tal circunstancia, escribir las constantes en hexadecimal es menos confuso que escribirlas en decimal, porque un dígito hexadecimal corresponde perfectamente a cuatro bits (medio byte; un 'mordisco') y dos a un byte: el número
0x3f
tiene todos los bits establecido en el mordisco bajo, y dos bits establecidos en el mordisco alto.También podría escribir esa segunda línea en octal:
Aquí, cada dígito corresponde a un bloque de tres bits. A algunas personas les resulta más fácil pensar en eso, aunque creo que es bastante raro en estos días.
fuente
La razón principal por la que uso bases diferentes es cuando me importan los bits.
Es mucho más fácil de leer
que
O imagina algo más complejo
comparado con
Aquí está muy claro cuál es la intención con los ejemplos hexadecimales porque el hexadecimal es básicamente una forma más compacta de binario ... En contraste, la base 10 (lo que usamos) no se correlaciona tan bien con el binario.
También hay otras bases que puede usar en algunos idiomas. Encontrará muy poco uso de bases que no sean binario, hexadecimal y decimal. Algunas personas extrañas aún usan octal, pero eso es lo más esotérico que verá en un programa sensato.
fuente
Como probablemente sepa, las computadoras se basan en binarios: esta es la base 2.
Es fácil convertir entre base 2 y 4, 8 y 16 (y múltiplos similares de 2), y mantener esta traducción en el código fuente puede hacer que trabajar con números sea mucho más fácil de razonar.
Para lenguajes de bajo nivel como Assembly y C, esto puede traducirse directamente a las operaciones del procesador (desplazamiento de bits para división y multiplicación, por ejemplo), lo que significa que el uso de estas bases numéricas termina con un código mucho más rápido.
Además, no todas las operaciones son operaciones numéricas; hay mapas de bits en los que es necesario manipular los bits directamente; el uso de una base 2 o uno de sus múltiplos para hacerlo facilita mucho las operaciones.
Si desea obtener más información, le recomiendo leer Code by Charles Petzold .
fuente
Quizás si estuvieras escribiendo un juego que simula la economía de alguna civilización antigua que usa un sistema base 12.
fuente
Fuera de los programas altamente especializados, es bastante raro usar bases que no sean 10, 16 o 2.
La base 16 (hexadecimal) es útil simplemente porque el rango completo de un byte (0-255) se puede representar en dos dígitos (0x00-0xFF), lo que puede hacer que trabajar con volcados hexadecimales sin procesar o datos binarios sea mucho más fácil. El hexadecimal también es útil cuando se usan máscaras de bits con operadores bit a bit, ya que la correspondencia de dos dígitos a un byte ayuda con la legibilidad.
Más raramente, la base 2 (binaria) también se puede usar con operaciones bit a bit, pero muchos lenguajes de programación no admiten literales base-2, y de todos modos el hexadecimal es mucho más conciso y legible.
Base-8 (octal) también se usa a veces debido a los permisos de archivos UNIX. Aparte de eso, es bastante raro usar bases distintas de 10 fuera de contextos matemáticos altamente especializados.
fuente
La razón válida más común para usar otras bases tiene que ver con la facilidad de conversión a base 2: es trivial convertir un número base-8 o base-16 a binario sin usar una calculadora al memorizar una tabla corta de ocho o dieciséis números:
Esto abre múltiples posibilidades:
0xFF00FF
es magenta (Rojo + Azul); la tarea es mucho más difícil cuando se te presenta16711935
fuente
A la computadora (o más exactamente al compilador) realmente no le importa en absoluto qué base numérica usa en su código fuente. Los lenguajes de programación más utilizados admiten las bases 8 (octal), 10 (decimal) y 16 (hexadecimal) directamente. Algunos también tienen soporte directo para números de base 2 (binarios). Los idiomas especializados también pueden admitir otras bases numéricas. (Por "soporte directo", quiero decir que permiten la entrada de números en esa base sin recurrir a trucos matemáticos como desplazamiento de bits, multiplicación, división, etc. en el código fuente mismo. Por ejemplo, C admite directamente base-16 con su
0x
prefijo de número y el conjunto de dígitos hexadecimales regulares de 0123456789ABCDEF. Ahora, tales trucos pueden ser útiles para hacer que el número sea más fácil de entender en contexto, pero siempre que pueda expresar el mismo número sin ellos, hacerlo, o no, es solo una conveniencia).Al final, sin embargo, eso es intrascendente. Digamos que tiene una declaración como esta a continuación:
La intención es crear una variable entera e inicializarla con el número decimal 10. ¿Qué ve la computadora?
El compilador tokenizará esto, y se dará cuenta de que está declarando una variable de tipo
int
con el nombren
, y le asignará un valor inicial. ¿Pero cuál es ese valor?Para la computadora, e ignorando los problemas de ordenación y alineación de bytes, la entrada para el valor inicial de la variable es
0x31 0x30
. ¿Significa esto que el valor inicial es 0x3130 (12592 en base 10)? Por supuesto no. El analizador de idiomas debe seguir leyendo el archivo en la codificación de caracteres utilizada, por lo que se lee1
0
seguido de un terminador de instrucción. Dado que en este lenguaje se supone la base 10, esto se lee (al revés) como "0 unidades, 1 decenas, final". Es decir, un valor de 10 decimales.Si especificamos un valor en hexadecimal y nuestro lenguaje utiliza
0x
para especificar que el siguiente valor está en hexadecimal, obtenemos lo siguiente:El compilador ve
0x
(0x30 0x78) y reconoce eso como el prefijo de base 16, por lo que busca un número válido de base 16 que lo siga. Hasta el terminador de la declaración, se lee10
. Esto se traduce en 0 "unos", 1 "sixteens", lo que equivale a 16 en la base 10. O 00010000 en la base 2. O, de lo contrario, le gustaría representarlo.En cualquier caso, e ignorando las optimizaciones por simplicidad, el compilador asigna suficiente almacenamiento para contener el valor de una
int
variable de tipo, y coloca allí el valor que leyó del código fuente en algún tipo de variable de retención temporal. Luego (probablemente mucho más tarde) escribe los valores binarios resultantes en el archivo de código objeto.Como puede ver, la forma en que escribe valores numéricos en el código fuente es completamente intrascendente. Se puede tener una muy leve efecto sobre el tiempo de compilación, pero me imagino que (de nuevo, ignorando optimizaciones tales como el almacenamiento en caché de disco por el sistema operativo) cosas como la turbulencia aleatoria alrededor de los platos giratorios del disco, tiempos de acceso al disco, colisiones de bus de datos , etc., tienen un efecto mucho mayor.
En pocas palabras: no te preocupes por eso. Escriba los números en una base que sea compatible con el lenguaje de programación que elija y que tenga sentido sobre cómo se usará o leerá el número. Pasó mucho más tiempo leyendo esta respuesta de lo que nunca se recuperará en los tiempos de compilación al ser inteligente sobre qué base de números usar en el código fuente. ;)
fuente
Aquí hay algunas razones que aún no aparecían ...
x00: algunas API de sistemas operativos y dispositivos de hardware esperan que los argumentos estén en hexadecimal / binario. Cuando codifica tales API, es más fácil usar los números en el mismo formato que la API espera en lugar de convertirlo entre diferentes bases. Por ejemplo, para enviar un byte de fin de mensaje a un servidor o para enviar un mensaje para cerrar una conexión a un canal de comunicación.
x01: es posible que desee que su aplicación represente caracteres no disponibles en ciertos teclados, como el signo de copyright (\ u00a9).
x02 - Para que algunas constantes / literales persistan (visualmente) en diferentes configuraciones culturales, especialmente cuando el código fuente / archivos se mueven a través de desarrolladores con diferentes configuraciones locales.
x03 - Para que su código se vea confuso y complejo - ¡Lo bueno es que C # no admite constantes octales!
fuente
La cuestión clave es representar una sola palabra del tamaño de la computadora de manera razonable. El 6502 era un procesador de 8 bits. El 4004 era un procesador de 4 bits.
Cuando se trata de un número de 4 u 8 bits funciona muy bien. Un número de 4 bits es un solo carácter hexadecimal. Un número de 8 bits (un byte) son dos dígitos hexadecimales. Los sistemas que tienen una potencia de palabra de 2 tamaños son los estándares más comunes en la actualidad: 16 bits, 32 bits, 64 bits. Todos estos se dividen entre 4 muy bien para la representación como hexadecimal.
Octal (base 8) se usó en sistemas donde el tamaño de la palabra era 12, 24 o 36. El PDP8, IBM Mainframe e ICL 1900 de días de antigüedad los usaban. Estas palabras se representaron más fácilmente usando octetos en lugar de un rango limitado de hexadecimales (sí, también se dividen en 4).
Aparentemente también hubo un ahorro de costos al usar la numeración de base 8. Representando 12 bits en BCD, el primer dígito solo puede ser 0-4 pero el segundo, tercero y cuarto pueden ser 0-9. Si esto se hizo como hexadecimal, uno tiene 3 caracteres hexadecimales, pero cada uno tiene 16 valores posibles. Era más barato producir un tubo nixie que solo tuviera 0-7 que uno que tuviera 0-9 (con lógica adicional para BCD) o 0-F para hexadecimal.
Todavía hoy se ve octal con permisos de archivo Unix (755, 644) donde el propietario, el grupo y el mundo tienen 3 bits que representan los permisos.
En el mundo de las matemáticas, ocasionalmente se hacen cosas extrañas con diferentes bases. Por ejemplo, una secuencia débil de Goodstein del proyecto euler 396 ... o algo más simple con números palindrómicos . Existe la propiedad de un número en la base N de que un número que es un múltiplo de N - 1 tendrá sus dígitos sumando un múltiplo de N - 1 . Además, si N - 1 es un cuadrado perfecto, esta propiedad también existe para sqrt ( N - 1 ). Esto tiene algunas aplicaciones en ciertos problemas matemáticos.
fuente
En la industria financiera, existe un esquema de identificación que es efectivamente base 36 . Utiliza los números 0-9 y las letras BZ para representar dígitos valorados 0-35. Se salta las vocales para evitar que se generen nombres desagradables.
Sin embargo, no es perfecto. Hubo un tiempo en que una compañía desafortunada tenía la identificación
B000BZ
.fuente
Motivo n. ° 1: porque todos los números a nivel de circuito están representados en la base 2 (el interruptor eléctrico está encendido o apagado). Razón # 2: porque en un nivel más alto que los circuitos reales, los bits se agrupan en bytes, y los bytes se pueden representar fácilmente como dos dígitos hexadecimales, cuando tomaría 3 dígitos decimales (y alguna validación) para representar todos los valores posibles de byte.
Entonces, si está trabajando en estos niveles (o aproximándolos, en algún entorno administrado), es más fácil trabajar en binario o hexadecimal que en decimal. Las situaciones en las que haría esto son variadas, pero generalmente nunca son situaciones en las que solo necesita aritmética básica.
fuente
Un área donde los números de base 16 (hexadecimales) se usan con mucha frecuencia es la especificación del color, especialmente cuando se usa HTML / CSS para la web. Los colores que usamos en las pantallas digitales se especifican usando una combinación de 3 valores de intensidad para 3 colores "base" (RGB - rojo, verde, azul) que se mezclan para crear cualquiera de los 16 millones de colores visualizables (usando color de 24 bits) )
Por ejemplo, el verde de intensidad completa en hexadecimal sería
0x00ff00
y65280
en decimal. Ahora imagine tratar de mezclar "manualmente" un color en su cabeza que tenga partes iguales de rojo y azul, digamos a media intensidad, para crear un bonito color púrpura :) En hexadecimal esto se escribiría simplemente como0x800080
mientras el valor decimal para esto sería8388736
. Se vuelve aún más fácil cuando se trabaja con tonos de gris: 50% de gris es0x808080
(hexadecimal) y8421504
(decimal), 75% es0xC0C0C0
y12632256
, y así sucesivamente.El uso del hexadecimal es mucho más intuitivo y cualquiera que esté familiarizado con este uso del color podrá "adivinar" el color inmediatamente con solo mirar el valor hexadecimal. También es mucho menos propenso a errores si necesita usar el mismo color varias veces (que suele ser el caso).
Echa un vistazo a cualquier página web (y en particular al CSS) para ver una cantidad loca de uso hexadecimal: D
NOTA: En CSS, los valores hexadecimales se escriben usando un
#
prefijo, por ejemplo:#00ff00
para verde, y también a veces se acorta a solo tres dígitos, como#0f0
por ejemplo para verde.fuente
Para algunos algoritmos, la base 2 tiene más sentido que cualquier otra cosa. Por ejemplo, ¿preferiría escribir una función para atravesar un árbol binario o un árbol de 10 arios?
Pero, con mayor frecuencia, se usa la base 2 porque así es como las computadoras representan casi universalmente sus números. Esto significa que:
Además, siempre existe la rara aplicación que inherentemente requiere una base impar que puede no ser 2 o 10.
fuente
2
personaje extraño que estás usando?Es sinceramente preferencia, si por alguna razón tienes polidactilia y tienes 11 dedos o te gusta contar con los dedos de los pies, así que te gusta trabajar en la base 20, honestamente depende de ti. Pero tenga en cuenta que, en un tema de universalidad, la mayoría de nosotros que tenemos que lidiar con bits y bytes a diario se marcará realmente si obtenemos algo que está haciendo manipulación de bits en la base 19.
RAZONES PARA LA BASE x
Base 10: modelo de todas nuestras cosas porque tenemos 10 dígitos de conteo (los pies son raros y malolientes, por lo que no los usamos).
Base 2 - Las computadoras usan esto para bits (encendido / apagado) esto está relacionado con niveles de voltaje legibles que se propagan por puertas / transistores / condensadores.
Base 8: antiguo, cuando las computadoras no eran súper grandes (o cuando eran espaciales), esto era bueno para algo u otro (no me gusta ni un poco)
Base 16: buena para mostrar mordiscos superiores e inferiores de un byte para la manipulación de bits. Esto es súper útil en el mundo embebido / fpga / hardware.
BASES NORMALES EN COMPUTADORAS
Para ir con preferencia, podría decirle exactamente cómo "en" un color está en un valor RGB hexadecimal que se me da, esto en consecuencia se puede representar en un solo int en el hardware y luego con algunos cambios se me puede devolver fácil de usar, 1 color complejo = 1 punto de datos que es bueno para el procesamiento de imágenes grandes con memoria limitada. Compare eso con una representación de base 10, podría agregarlos todos y almacenarlos en un número, pero qué número es cuál, o tal vez R es el tiempo 10000, G es 100 y B es su propio espacio, son muchas operaciones matemáticas , por lo general, las multiplicaciones cuestan más ciclos que un turno, por lo que su siguiente pieza de datos ya está en la cola antes de que haya terminado con su última pieza procesada, vaya, eso ya no está.
A veces es mejor trabajar en base 2, 8 o 16. Con la mayoría de las máquinas, multiplicar por 2 es solo un poco de cambio, son súper rápidas, lo mismo con una división por 2.
Para exponer aún más sobre la idea de un poco de tonterías. Cuando trabajo en un entorno integrado, he necesitado muchas veces para acceder a una serie de luces, interruptores u otros elementos mapeados de registro.
En este caso, asignar un carácter completo, byte o int a cada interruptor sería ineficiente y tonto, un interruptor o luz tiene 2 posiciones - encendido y apagado - ¿por qué asignaría algo que tiene hasta 256 posiciones, o 2 ^ 16 posiciones, etc. Cada luz en una matriz puede ser de 1 bit que se ajuste a 8 o 16 o 32 o 64 o 128 (ancho de su tipo de datos) en una sola palabra / registro. La eficiencia del espacio es necesaria y bastante bienvenida.
Usar cualquier cosa que sea básica 2 ^ n en la programación para cosas como manejar datos RGB, muchos datos de señal (GPS, audio, ascii, etc.) es mucho más simple en hexadecimal, binario y octal, ya que así es como se representa en la máquina y uno puede discernir más fácilmente lo que se presenta y cómo manipularlo.
UTILIZANDO BASES EXTRAÑAS
No hay eficiencia a menos que lo codifique. Desea la base 11, debe configurar un tipo de datos y sobrecargar a los operadores para que manejen su representación ante el usuario. No veo ninguna razón por la cual un sistema que contenga 5 elementos, y que solo contenga múltiplos de 5 elementos, deba convertirse en la matemática de cinco elementos. Además, es mejor que reces para que quien decida escribir su código para la base 271 lo documente bien o podrías dedicar más tiempo a comprenderlo de lo que vale para crear la base 271 porque todos los elementos son múltiplos de 271.
fuente
En los viejos tiempos de las computadoras, teníamos una serie de pantallas que podían mostrar los dígitos 0-9, pero aún no teníamos AF.
http://ad7zj.net/kd7lmo/images/ground_nixie_front.jpg es uno de esos ejemplos ...
Octal encajaba muy bien en estas pantallas y era más fácil que binario o decimal.
fuente
Me sorprende que todas las otras respuestas no hayan mencionado dos usos muy comunes en la informática para bases alternativas:
Compresión : a menudo es deseable representar un número binario, decimal o hexadecimal en una base más grande para acortar la representación. Por ejemplo, todos los acortadores de bits como bit.ly están haciendo esto. O puede hacerlo para acortar un GUID para su uso en una URL.
fuente