He tomado bastantes clases de programación de introducción en mi día, principalmente solo para mojarme los pies en cada tipo diferente de programación que encuentro. No es sorprendente que casi todas las clases pasen por el mismo formato: introducción al hardware, introducción al software, y luego ingrese a la programación real. Si bien entender cómo funciona el hardware y el software es muy importante, siempre me ha confundido un tema que ha estado en cada curso.
En la sección de introducción al software que he encontrado, sin lugar a dudas, siempre ponen gran énfasis en saber leer y escribir en sistemas de números binarios, hexadecimales y, a veces, incluso octales. Entiendo que es bueno entender qué son estas cosas y cómo las interpretaría una computadora, pero nunca me encontré realmente necesitando saber cómo leer y escribir ninguno de esos sistemas numéricos. Realmente, la única vez que he visto algo diferente a la base 10 es para colores en CSS, lo cual es aún más fácil si usas algo como www.colorpicker.com
¿Acabo de ignorar los maravillosos usos de estos sistemas de números que no son de base 10 en el mundo de la programación, o es una vieja tradición incluir estas secciones en todos los libros de texto de programación? ¿Alguien tiene un buen ejemplo de dónde el programador promedio realmente usaría un número octal?
fuente
Respuestas:
Todas las respuestas son buenas, pero no abordan lo que creo que es la parte más valiosa. Aprender a "pensar" en diferentes bases te hace mucho más fluido con la forma en que las computadoras manejan los números.
Si quisieras almacenar una cadena de letras minúsculas bien empaquetadas, ¿cómo lo harías?
Bueno, hay 26 letras minúsculas, que se traducen fácilmente en un rango de 0-31, que es un número de 5 bits, puede empaquetar 6 números de 5 bits en un campo de 32 bits (int?) E incluso tener suficiente por algunos signos de puntuación.
No digo que hexadecimal ayude con cosas como esta, sino que entiendo cómo funciona la conversión de números.
Otro caso, de vez en cuando usas base-64 para pasar números algo largos en ascii. ¿Sabrías cómo implementar esto? ¿Por qué implementarlo de esa manera? ¿Te diste cuenta de que eso es lo que estabas escribiendo cada vez que escribías la "CLAVE DEL CD" en el cuadro de registro de un juego?
Además, para divertirse, juegue con la base 12 durante algún tiempo. La matemática resulta ser realmente interesante en la base 12 (la base 10 es estúpida en comparación, ojalá hubiéramos evolucionado con 6 dedos; podríamos estar décadas adelante en nuestra comprensión de las matemáticas). Algunos humanos primitivos muy inteligentes usaron la base 12 para desarrollar el reloj.
En la base 10 tenemos 3 números "geniales" que crean patrones fáciles, 2, 5 y 9 con 8, 6 y 4 como números geniales "menores". En la base 12 tiene 2,3,4,6,11 como números "Cool" con 8,9 y 10 como números "Menores", lo que significa que si usáramos la base 12 sería mucho mejor reconocer patrones en números porque los estaríamos viendo todo el tiempo.
Además, binario. Puede contar con una mano hasta 32: lo hago bastante, a veces es útil cuando contar hasta 5 simplemente no es suficiente :)
Binario es muy divertido, pero simplemente no se traduce bien. Cuando te vuelves bueno con el hexadecimal, comienzas a ver "A" como 1010 y "5" como 0101, y estas cosas comienzan a importar realmente. Si tiene un campo de bits del que desea extraer el sexto bit: 00100000, ¿con qué "y" está? Solo debes saber que es 0x20.
Si ve un código que dice algo con 0x0600, ¿qué bits se extraen? Debería saberlo sin pensarlo: debería leerlo como si estuviera escrito 0000011000000000 (pero más fácil de leer porque no tiene que contar ceros).
¿Por qué querrías limitar tu cerebro y su capacidad para procesar datos?
fuente
¿Qué hay que aprender? Necesitas entender diferentes bases numéricas para ser un programador competente, pero con respecto al hexadecimal hay poco que aprender, excepto que ABCDEF viene después del 9.
fuente
Octal? En general, no, no, con la excepción de los permisos * nix.
Hexadecimal? Usted apuesta. Estás ignorando a la gran cantidad de nosotros que estamos barajando bits alrededor de sistemas embebidos, mirando protocolos o formatos de archivos a nivel de bits, etc. Pero claro, si está lejos del metal haciendo aplicaciones o trabajo web, puede salirse con la suya más fácilmente.
Ejemplo: registros de configuración en microcontroladores y similares.
Tome el número 54312, tomado al presionar teclas al azar. ¿Puedes decir qué bits están establecidos? No puedo, al menos no fuera de mi cabeza. El equivalente hexadecimal entonces, eso es 0xd428. Esepor otro lado, me dice de inmediato que el patrón de bits que estoy viendo es 1101 0100 0010 1000. Está más lógicamente estructurado para ese tipo de cosas, y te encuentras necesitando esto todo el tiempo cuando estás cerca del metal. Digamos que el número anterior es lo que obtengo al reiniciar desde el mcu, y que necesito los bits 7 y 9 configurados por alguna razón. En hexadecimal, puedo ver fácilmente que el número resultante debería ser 0xd6a8, ¿pero en decimal? Eso es 54952, ni de lejos tan intuitivo si me preguntas. Claro, se trata de agregar 640 al valor, pero es más difícil de entender. Por supuesto, en la práctica, uno simplemente puede cambiar en bits a la posición correcta y O con el valor original, pero aún así es posible que desee saber cuál es la representación final.
fuente
¿Alguien tiene un buen ejemplo de dónde el programador promedio realmente usaría un número octal?
Si está configurando permisos en un archivo en Unix (o Linux), utiliza un número octal de 3 dígitos. El primer dígito son los permisos del usuario, el segundo son los permisos del grupo y el último dígito son los permisos que todos los demás obtienen.
Tenía que entender este hecho en el código que escribí la semana pasada.
Si observa la salida de algoritmos de hashing estándar como MD5, a menudo los encontrará escritos en hexadecimal. He visto varios casos en los que esto conduce a la aritmética en bases inusuales.
Si desea comprender cómo se representa internamente el punto flotante y, por lo tanto, por qué 1/10 no se representa con precisión, es absolutamente necesario que comprenda cómo hacer aritmética en diferentes bases. Este es un conocimiento esotérico hasta el día en que te muerde en la retaguardia y de repente necesitas entenderlo rápidamente.
Y hay un montón de otros casos en los que encontrarás la naturaleza binaria fundamental de los datos dentro de las computadoras que están surgiendo. Por supuesto, si solo está escribiendo un sitio web de CRUD, es probable que nunca se encuentre con ninguno de ellos, ya que ocurre en niveles con los que alguien más ya se ha ocupado.
fuente
perl -le '@stat = stat(shift); print $stat[2]' some_file
y obtendrás una estadística como un número en la base 10. Debes pasarlo a Perl dechmod
la misma manera. Por lo tanto, tiene sentido almacenar el número de esa manera en una base de datos, momento en el que necesito documentar qué tienen que ver esos números con los permisos de Unix más familiares. Como dije, este no fue un ejemplo hipotético.Con suerte, en el mundo real, no se te interrogará sobre la conversión de Hex a binario a decimal. Tendrá herramientas a su disposición para convertir cualquier forma que desee.
Estoy de acuerdo en que debe comprender lo que está sucediendo, pero ¿por qué memorizar cuándo puede buscarlo?
Sin embargo, he encontrado útil recordar los números clave (para mí 0x64 = 100, 0xFF = 255, 0xFFFF = 65535, etc.) porque aparecen mucho.
¿Podría decir lo que es 8675309 en binario, hexadecimal y octal? No, pero puedo abrir una herramienta que puede cuando lo necesito.
fuente
elvis = 57005;
Lo único para lo que he usado octal es para los permisos de archivos en sistemas unix.
El hexadecimal y el binario son muy útiles si realiza algún trabajo cerca de los protocolos de cable o cerca de la transferencia de datos metálicos. Fundamentalmente, los datos fluyen en binario, que se representa trivialmente nibble a la vez como hexadecimal.
También encontrará que las hojas de datos suelen citar valores hexadecimales, por lo que es mejor mostrar el valor en el código tal como aparece en la hoja de datos.
Si usa cualquiera de ellos mucho, terminará siendo bastante hábil para convertir ay desde decimal en su cabeza, al menos para valores comunes.
Todo lo dicho Sospecho que el gran énfasis es principalmente histórico. Como usted dice, hay muchos programadores que tienen poca necesidad de otra cosa que no sea decimal.
fuente
En realidad se pregunta por qué aprender el poder de las representaciones de 2 números.
Las computadoras están hechas de circuitos , la corriente eléctrica fluye a través de los circuitos en dos niveles diferentes, alto y bajo para representar los dos niveles de corrientes, utilizamos dígitos binarios porque pueden contener dos estados, uno (alto) o cero (bajo).
Los dígitos binarios forman patrones . Por ejemplo, si la única forma en que usted y yo podemos hablar es a través de un circuito, podemos establecer que si desea enviarme la letra A, me enviará el patrón binario: 1000001. Como soy vago , No quiero memorizar los 7 siete dígitos. Más bien, usaré un sistema de numeración de potencia 2 para representar dígitos binarios grandes en uno más pequeño. Puedo usar 8 (2 ^ 3) o 16 (2 ^ 4).
Como puede ver, la mayoría del hardware y software de las computadoras usan una representación binaria y los humanos usamos el poder de 2 representaciones como octal y hexadecimal para leer la representación binaria de una manera más eficiente e indolora.
Ahora, ejemplo del programador promedio que necesita comprender el poder de 2 representaciones:
Ahora mis últimos dos centavos, estoy muy seguro de que puedes aprender bastante rápido cualquier poder de 2 representaciones (ya que ya administraste los cursos de programación de introducción). Puede que olvides la conversión, pero no debería ser un concepto extraño si quieres ser un programador promedio.
fuente
Nunca he usado octal, pero no es inusual ver hexadecimal en el depurador y, en ocasiones, tiene mucho más sentido usar hexadecimal en su código fuente (normalmente, porque los datos subyacentes son indicadores de bits).
fuente
No sé si hay mucha necesidad en estos días, pero hace muchos años, cuando era un programador de sistemas, era esencial poder leer y comprender hexadecimal. Se me presentaría un volcado de almacenamiento (todo en hexadecimal) y decodificaría la representación hexadecimal de nuevo al lenguaje de ensamblaje de IBM. Después de hacerlo por un tiempo, terminas siendo capaz de hacerlo directamente: lee el hexadecimal y escribe el equivalente de ensamblaje. Muy útil para la depuración. Sumar y restar valores hexadecimales fue útil para calcular las compensaciones de los registros base.
Sospecho que ahora hay poca necesidad de hacerlo en la práctica, pero saberlo difícilmente puede ser algo malo.
fuente
No se trata de ser "fluido" en la lectura binaria / hexadecimal, sino lo suficientemente cómodo como para que pueda hacer una conversión mental rápidamente cuando los encuentre. Imagine la programación sin sentirse cómodo con la aritmética simple, y tenía que ir a una calculadora cada vez que necesitaba multiplicar por dos.
El hexadecimal / binario es importante porque este es el lenguaje en el que las computadoras hablan. Siempre lo encontrará en lugares, especialmente cuando realice ejercicios de depuración y sus datos estén en hexadecimal.
También enfatizaría la importancia de comprender la base-2 en el contexto de cómo se representan internamente los diferentes tipos numéricos y cómo funciona la aritmética. Con esto, comprenderá mejor cuándo y cómo lidiar con problemas de redondeo de punto flotante y desbordamiento de enteros, por ejemplo.
Como un ejemplo más, las operaciones bit a bit y las marcas de bit aún prevalecen en la programación, y este es otro lugar donde es importante comprender la base-2.
fuente
¿Nunca ha tenido que buscar un personaje en las tablas de códigos Unicode ? ¿Nunca has visto una URL que tenía
%20
en ella? ¿Nunca usó un GUID ? ¿Nunca has visto una dirección IPv6 ? ¿Nunca escribiste unBLOB
literal en SQL? ¿Nunca ha visto un archivo en un editor hexadecimal? Hay muchas cosas relacionadas con la computadora que se anotan convencionalmente en hexadecimal.En cuanto a octal, es raro hoy en día, pero aún se usa para los permisos del sistema de archivos Unix.
Ver también: aplicaciones prácticas de operaciones bit a bit.
Incluso si puede evitar realizar alguna programación "cercana al cable", es importante tener en cuenta el hecho de que las computadoras funcionan en binario, por una sencilla razón: las fugas de abstracciones .
La
int
abstracción en la mayoría de los idiomas pierde su naturaleza de ancho fijo. Los enteros se desbordan, y lo hacen en números binarios "redondos" como 2 31 . Un pensador solo decimal no podría explicar el error del año 2038 .La abstracción
float
/double
pierde su raíz de 2. Si escribe0.1
, realmente obtiene 0.1000000000000000055511151231257827021181583404541015625. Y obtendrá errores si esperaba un 0.1 exacto.fuente
Reconocer números particulares cuyos patrones son simples en otras bases es a menudo una gran pista para resolver errores. Si su respuesta es incorrecta para 347, eso quizás no signifique nada, pero si está desactivada para 256 o 128, tal vez sí signifique algo. Si coloca -1 en un tipo de datos de 16 bits sin signo, obtiene 65535, que es 1 menos que 65536. Si sabe que 2 ^ 16, detecta su problema de inmediato.
En cuanto a octal, eche un vistazo a estas preguntas y vea si reconocer octal cuando lo solicita accidentalmente habría hecho que cualquiera de estas personas fuera mejores programadores.
fuente
Existen algunas técnicas de compresión de datos y matemática altamente eficientes que puede utilizar cuando comprende estos sistemas y cómo funcionan. Probablemente no los use mucho en sus primeros trabajos. Pero tenerlos en tu bolsillo trasero cuando te conviertes en un senior y se te pide que hagas que el sistema heredado con exceso de trabajo que se ejecuta en el servidor de dinosaurios con exceso de trabajo con poco poder sea bueno.
Se vuelve más importante cuando se trata de controladores y dispositivos electrónicos que no tienen una API. Especialmente si estás escribiendo esa API.
fuente
En la introducción a los cursos de programación que forman parte del estudio en ciencias de la computación, tiene mucho sentido conocer bien ese material. Revisas el tema al programar en lenguaje ensamblador, al diseñar hardware, tomar un curso sobre lenguajes formales, etc. Todos los ingenieros eléctricos de mi universidad requieren un curso de introducción a la programación y probablemente continuarán usando esa información. Fuera de eso, no es terriblemente importante.
fuente
Los números octales son ocasionalmente útiles cuando se trata de charsets. Estos últimos están basados en bytes, y un octal = 8 bits = un byte. En UTF-8, por ejemplo, los caracteres que no son ASCII pueden tener dos o más bytes; Los números octales son más convenientes para representarlos que los números hexadecimales.
Los bits son útiles porque ... ¡oye! Sabes que tu computadora está constantemente lidiando con 0s y 1s, ¿verdad? Quiero decir en serio ... No se trata solo de poder bromear que los informáticos son los únicos que saben que 1 + 1 = 10. También es útil para operadores relacionados con bits o como varbits. Estos últimos permiten reducir los requisitos de almacenamiento en las bases de datos cuando se trata de series de banderas.
En cuanto a hexadecimal, supongo que nunca has abierto un editor hexadecimal para aumentar las estadísticas y el equipo de tu personaje RPG. Si lo hubiera hecho en lugar de descargar un editor de personajes, sabría muy bien por qué es conveniente poder dar sentido a los números hexadecimales. ;-)
fuente
Me gradué de la universidad hace 3 años, y creo que es muy importante poder leer y escribir números hexadecimales. Me meto con una gran cantidad de archivos XML grandes para el trabajo (gran significado 100 MB +). A veces, obtendrá un archivo XML que se queja de caracteres XML no válidos, que no se pueden mostrar en ningún editor de texto, por lo que tuve que usar el editor Hex y escribir código para identificar los caracteres no válidos. Esa tarea sería muy difícil sin saber el número hexadecimal.
fuente
Hace muchos años aprendí el valor del hexadecimal mientras trabajaba en sistemas de 8 bits.
La claridad de entender que algo estaba ubicado en B000 o E7FF fue increíble.
Ayer necesitaba saber exactamente qué caracteres estaban al final de una línea de texto. Conocer la diferencia entre 0x0A y 0x0A 0x0D puede ser realmente importante.
fuente
Octal en estos días es bastante raro, pero uso hexadecimal con mucha frecuencia, y a menudo pienso en problemas en binario.
Programa principalmente en C y C ++, con algunos Objective C, y trabajo mucho con gráficos de trama y vectoriales en Linux y Mac OS X. En esos ámbitos, es fundamental escribir código que se ejecute de manera eficiente y haga un buen uso del almacenamiento. También debe comprender la forma en que las máquinas representan internamente con lo que está trabajando. La forma más conveniente de ver eso es en hexadecimal. Por ejemplo, un píxel de color estándar de 24 bits se representa en tres bytes, y saber de un vistazo que 0x000000 es negro, 0x00FF00 es rojo y 0x008000 es rosado es realmente muy útil.
También trabajo mucho con estándares internacionales para formatos de archivo. Uno con el que he estado trabajando recientemente es MXF, que se usa para almacenar video para transmisión, DVD, etc. Es un formato binario, y nuevamente, se trata más fácilmente usando hexadecimal o, a veces, binario. Cuando está depurando por qué algunos videos basados en MXF no se reproducen directamente en su sistema, es realmente útil poder echar un vistazo a un campo de 32 bits y darse cuenta de que el bit para dejar en blanco la pantalla se configura inadvertidamente, y puede hacerlo eso en hexadecimal, pero es prácticamente imposible en la base 10.
Si vas a pasar tu carrera escribiendo Perl para masajear cadenas de texto, entonces no, probablemente no necesites estar muy familiarizado con hexadecimal, octal o binario. Pero en el momento en que comienzas a lidiar con el tipo de cosas que hago, al menos hexadecimal y binario son esenciales.
fuente
Debes saber hexadecimal si quieres ser programador. Sería demasiado incómodo para ti tener que admitir en el trabajo el raro día que necesitas saber que no lo entiendes.
No significa que tenga que poder agregar números hexadecimales en su cabeza. Comienza a desordenar las reglas para la adición regular si lo haces de todos modos. :)
fuente
Lo que tienen en común binario, hexadecimal y octal no es que no sean base10, sino que son todas potencias de dos. Dado que las computadoras son inherentemente binarias, esto les da a cada una de ellas una aplicación donde son la forma más apropiada o eficiente de mostrar y manejar datos.
Esto solía ser muy importante, cuando toda la programación era de bajo nivel. En la programación de alto nivel que hoy en día, los sistemas de potencia de 2 números son mucho menos importantes. Tener una introducción exhaustiva a ellos en cada curso de programación podría ser una reliquia de los viejos tiempos.
Pero estos sistemas de números aún tienen sus usos, incluso cuando trabajas en idiomas de alto nivel. El color, por ejemplo, todavía se almacena en 24 bits, 8 bits por color primario. Y dado que el hexadecimal es la mejor manera de representar un byte de una manera legible para los humanos, incluso es parte de CSS, que se supone que puede ser utilizado por personas que nunca tuvieron una introducción a la programación.
No puedes entender las computadoras sin entender el binario. Una introducción al binario es una parte necesaria de cada introducción exhaustiva a la programación. Es posible que no necesite hacer muchas conversiones entre sistemas numéricos en el trabajo diario, pero hacer ejercicios como ese es la única forma de familiarizarse realmente con estos sistemas numéricos *. Conocer más de un sistema de 10 números no base es la única forma de entender adecuadamente, que los datos se pueden representar de muchas maneras, todas ellas válidas.
fuente
Creo que la conversión como tal de una base a otra no es muy importante para la programación. En la programación de alto nivel, no necesita las conversiones (y es posible que alguna vez lo haga, las funciones lib y la calculadora están disponibles). Cuando se sumerge en la programación de nivel inferior, ya no está en un curso introductorio.
Creo que dos temas (relacionados) son importantes para cubrir en un curso básico.
Sobre la codificación. No se trata de conversión matemática sino de usar números (cualquier tipo de números) para almacenar información (cualquier tipo de información). También podría ilustrar esto con código morse o pintar por números, si así lo desea. Pero dado que las computadoras usan binario y binario generalmente se muestran como hexadecimales, las cosas generalmente se ilustran con ejemplos hexadecimales. (Y, mientras lo hacen, podrían explicar un poco sobre los finales de línea, que se han mencionado en este tema. Solo aconsejaría reconocer las diversas formas y formas que esto podría tomar, algunas de ellas son 0x0D, 0x0A , CRLF, '\ n' y '\ r')
Problemas de desbordamiento. Una vez más, no hay necesidad de ilustrar esto con hexadecimal. Podría usar el ejemplo y2k (que no tiene nada que ver con el hexadecimal). Aquí también le aconsejaría que reconozca los diversos indicadores más probables (255, 32767, 65535, 2M14). Por qué son indicadores está directamente relacionado con la naturaleza bytewise de almacenamiento interno, pero la conversión no es la parte importante.
No estoy de acuerdo con que necesite saberlo para las banderas de bits (porque en un curso introductorio de programación, las constantes con nombre son mucho más instructivas y útiles).
fuente
Si ingresa a la programación integrada de bajo nivel, utilizará hexadecimal. Se utiliza para cosas como especificar patrones de bits en registros de hardware y valores de bytes en volcados de memoria. También aprenderá a usar todos los operadores de bits en cualquier lenguaje de programación que use.
fuente