Professional Documents
Culture Documents
El sistema binario, en ciencias e informtica, es un sistema de numeracin en el que los nmeros se representan utilizando solamente las cifras cero y uno (0 y 1). Es el que se utiliza en lascomputadoras, debido a que trabajan internamente con dos niveles de voltaje, por lo cual su sistema de numeracin natural es el sistema binario (encendido 1, apagado 0).
El antiguo matemtico indio Pingala present la primera descripcin que se conoce de un sistema de numeracin binario en el siglo tercero antes de nuestra era, lo cual coincidi con su descubrimiento del concepto del nmero cero Una serie completa de 8 trigramas y 64 hexagramas (anlogos a 3 bits) y nmeros binarios de 6 bits eran conocidos en la antigua China en el texto clsico del I Ching. Series similares de combinaciones binarias tambin han sido utilizadas en sistemas de adivinacin tradicionales africanos, como el If, as como en la geomancia medieval occidental. Un arreglo binario ordenado de los hexagramas del I Ching, representando la secuencia decimal de 0 a 63, y un mtodo para generar el mismo fue desarrollado por el erudito y filsofo Chino Shao Yong en el siglo XI. En 1605 Francis Bacon habl de un sistema por el cual las letras del alfabeto podran reducirse a secuencias de dgitos binarios, las cuales podran ser codificadas como variaciones apenas visibles en la fuente de cualquier texto arbitrario. El sistema binario moderno fue documentado en su totalidad por Leibniz, en el siglo XVII, en su artculo "Explication de l'Arithmtique Binaire". En l se mencionan los smbolos binarios usados
por matemticos chinos. Leibniz utiliz el 0 y el 1, al igual que el sistema de numeracin binario actual. En 1854, el matemtico britnico George Boole public un artculo que marc un antes y un despus, detallando un sistema de lgica que terminara denominndose lgebra de Boole. Dicho sistema desempeara un papel fundamental en el desarrollo del sistema binario actual, particularmente en el desarrollo de circuitos electrnicos.
es necesariamente el equivalente al valor numrico de uno; esto depende de la nomenclatura usada. De acuerdo con la representacin ms habitual, que es usando nmeros rabes, los nmeros binarios comnmente son escritos usando los smbolos 0 y 1. Los nmeros binarios se escriben a menudo con subndices, prefijos o sufijos para indicar su base. Las notaciones siguientes son equivalentes: 100101 binario (declaracin explcita de formato) 100101b (un sufijo que indica formato binario) 100101B (un sufijo que indica formato binario) bin 100101 (un prefijo que indica formato binario) 1001012 (un subndice que indica base 2 (binaria) notacin) %100101 (un prefijo que indica formato binario) 0b100101 (un prefijo que indica formato binario, comn en lenguajes de programacin)
Otra forma de conversin consiste en un mtodo parecido a la factorizacin en nmeros primos. Es relativamente fcil dividir cualquier nmero entre 2. Este mtodo consiste tambin en divisiones sucesivas. Dependiendo de si el nmero es par o impar, colocaremos un cero o un uno en la columna de la derecha. Si es impar, le restaremos uno y seguiremos dividiendo entre dos, hasta llegar a 1. Despus slo nos queda tomar el ltimo resultado de la columna izquierda (que siempre ser 1) y todos los de la columna de la derecha y ordenar los dgitos de abajo a arriba. Ejemplo 100|0 50|0 25|1 12|0 6|0 3|1 1|1 --> --> 1, 25-1=24 y seguimos dividiendo entre 2
Existe un ltimo mtodo denominado de distribucin. Consiste en distribuir los unos necesarios entre las potencias sucesivas de 2 de modo que su suma resulte ser el nmero decimal a convertir. Sea por ejemplo el nmero 151, para el que se necesitarn las 8 8 primeras potencias de 2, ya que la siguiente, 2 =256, es superior al nmero a convertir. Se comienza poniendo un 1 en 128, por lo que an faltarn 23, 151-128 = 23, para llegar al 151. Este valor se conseguir distribuyendo unos entre las potencias cuya suma d el resultado buscado y poniendo ceros en el resto. En el ejemplo resultan ser las potencias 4, 2, 1 y 0, esto es, 16, 4, 2 y 1, respectivamente. Ejemplo 20= 2= 2= 2=
3 2 1
24= 2= 26=
5
27= 128|1
Ejemplo 0,3125 (decimal) Proceso: 0,3125 2 = 0,625 => 0 0,625 0,25 0,5 2 = 1,25 2 = 0,5 2 = 1 => 1 => 0 => 1 -> 0,0101 (binario) => 0,0101 (binario).
0,1 (decimal) => 0,0 0011 0011 ... (binario). Proceso: 0,1 2 = 0,2 ==> 0 0,2 2 = 0,4 ==> 0 0,4 2 = 0,8 ==> 0 0,8 2 = 1,6 ==> 1 0,6 2 = 1,2 ==> 1 0,2 2 = 0,4 ==> 0 peridicamente <--se repiten las cuatro cifras,
<<<- ...
En orden: 0 0011 0011 ... => 0,0 0011 0011 ... (binario peridico) Ejemplo 5.5 = 5,5 5,5 (decimal) Proceso: 5 => 101 0,5 2 = 1 => 1 En orden: 1 (un slo dgito fraccionario) -> 101,1 (binario) Ejemplo 6,83 (decimal) Proceso: 6 => 110 0,83 2 = 1,66 => 1 0,66 2 = 1,32 => 1 0,32 2 = 0,64 => 0 0,64 2 = 1,28 => 1 0,28 2 = 0,56 => 0 0,56 2 = 1,12 => 1 0,12 2 = 0,24 => 0 0,24 2 = 0,48 => 0 0,48 2 = 0,96 => 0 0,96 2 = 1,92 => 1 0,92 2 = 1,84 => 1 0,84 2 = 1,68 => 1 En orden: 110101000111 (binario) Parte entera: 110 (binario) Encadenando parte entera y fraccionaria: 110,110101000111 (binario) => 110,110101000111 (binario). => 101,1 (binario).
2. Despus de realizar cada una de las multiplicaciones, sume todas y el nmero resultante ser el equivalente al sistema decimal. Ejemplos: (Los nmeros de arriba indican la potencia a la que hay que elevar 2)
Tambin se puede optar por utilizar los valores que presenta cada posicin del nmero binario a ser transformado, comenzando de derecha a izquierda, y sumando los valores de las posiciones que tienen un 1. Ejemplo El nmero binario 1010010 corresponde en decimal al 82. Se puede representar de la siguiente manera:
Para cambiar de binario con decimales a decimal se hace exactamente igual, salvo que la posicin cero (en la que el dos es elevado a la cero) es la que est a la izquierda de la coma y se cuenta hacia la derecha a partir de -1:
1 2 elevado a -1 = 0,5
0 2 elevado a -2 = 0 1 2 elevado a -3 = 0,125 0 2 elevado a -4 = 0 0 2 elevado a -5 = 0 1 2 elevado a -6 = 0,015625 La suma es: 0,640625
1 2 elevado a -1 = 0,5 1 2 elevado a -2 = 0,25 0 2 elevado a -3 = 0 1 2 elevado a -4 = 0,0625 1 2 elevado a -5 = 0,03125 1 2 elevado a -6 = 0,015625 La suma es: 0,859375
1 10
Las posibles combinaciones al sumar dos bits son: 0+0=0 0+1=1 1+0=1 1 + 1 = 10
Note que al sumar 1 + 1 es 102, es decir, llevamos 1 a la siguiente posicin de la izquierda (acarreo). Esto es equivalente, en el sistema decimal a sumar 9 + 1, que da 10: cero en la posicin que estamos sumando y un 1 de acarreo a la siguiente posicin. Ejemplo
1 10011000 + 00010101 10101101 Se puede convertir la operacin binaria en una operacin decimal, resolver la decimal, y despus transformar el resultado en un (nmero) binario. Operamos como en el sistema decimal: comenzamos a sumar desde la derecha, en nuestro ejemplo, 1 + 1 = 10, entonces escribimos 0 en la fila del resultado y llevamos 1 (este "1" se llama acarreo o arrastre). A continuacin se suma el acarreo a la siguiente columna: 1 + 0 + 0 = 1, y seguimos hasta terminar todas la columnas (exactamente como en decimal).
La resta 0 - 1 se resuelve igual que en el sistema decimal, tomando una unidad prestada de la posicin siguiente: 0 - 1 = 1 y me llevo 1 (este valor se resta al resultado que obtenga, entre el minuendo y el sustraendo de la siguiente columna), lo que equivale a decir en el sistema decimal, 2 - 1 = 1. Ejemplos 10001 -01010 111 00111 11011001 -10101011 1 111 00101110
En sistema decimal sera: 17 - 10 = 7 y 217 - 171 = 46. Para simplificar las restas y reducir la posibilidad de cometer errores hay varios mtodos: Dividir los nmeros largos en grupos. En el siguiente ejemplo, vemos cmo se divide una resta larga en tres restas cortas:
Utilizando el complemento a dos (C2). La resta de dos nmeros binarios puede obtenerse sumando al minuendo el complemento a dos del sustraendo.
Ejemplo La siguiente resta, 91 - 46 = 45, en binario es: 1011011 -0101110 0101101 el C2 de 0101110 es 1010010 1011011 +1010010 10101101
En el resultado nos sobra un bit, que se desborda por la izquierda. Pero, como el nmero resultante no puede ser ms largo que el minuendo, el bit sobrante se desprecia. Un ltimo ejemplo: vamos a restar 219 - 23 = 196, directamente y utilizando el complemento a dos: 11011011 11011011 -00010111 +11101001 11000100 111000100 Y, despreciando el bit que se desborda por la izquierda, llegamos al resultado correcto: 11000100 en binario, 196 en decimal. Utilizando el complemento a uno. La resta de dos nmeros binarios puede obtenerse sumando al minuendo el complemento a uno del sustraendo y a su vez sumarle el bit que se desborda. el C2 de 00010111 es 11101001
El algoritmo del producto en binario es igual que en nmeros decimales; aunque se lleva a cabo con ms sencillez, ya que el 0 multiplicado por cualquier nmero da 0, y el 1 es el elemento neutro del producto. Por ejemplo, multipliquemos 10110 por 1001: 10110 1001 10110 00000 00000 10110 11000110 En sistemas electrnicos, donde suelen usarse nmeros mayores, se utiliza el mtodo llamado algoritmo de Booth. 11101111 111011 __________ 11101111 11101111 00000000 11101111 11101111 11101111 ______________ 11011100010101
Nmero en binario 000 001 010 011 100 101 110 111
Nmero en octal
3) La cantidad correspondiente en octal se agrupa de izquierda a derecha. Ejemplos 110111 (binario) = 67 (octal). Proceso:
111 = 7 001 = 1 11 entonces agregue un cero, con lo que se obtiene 011 = 3 Agrupe de izquierda a derecha: 317
011 = 3 000 = 0 1 entonces agregue 001 = 1 Agrupe de izquierda a derecha: 103 Si el nmero binario tiene parte decimal, se agrupa de tres en tres desde el punto decimal hacia la derecha siguiendo los mismos criterios establecidos anteriormente para nmeros enteros. Por ejemplo: 0.01101 (binario) = 0.32 (octal) Proceso: 011 = 3 01 entonces agrege 010 = 2 Agrupe de izquierda a derecha: 32 Agrege la parte entera: 0.32
Nmero 000 000 001 001 010 010 011 011 100 100 101 101 110 110 111 111 en 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 binario
3) La cantidad correspondiente en hexadecimal se agrupa de derecha a izquierda. Ejemplos 110111010 (binario) = 1BA (hexadecimal). Proceso:
0101 = 5 1111 = F 110 entonces agregue 0110 = 6 Agrupe de derecha a izquierda: 6F5
Tabla de conversin entre decimal, binario, hexadecimal, octal, BCD, Exceso 3 y Gray o Reflejado[editar editar cdigo]
Decimal Binario Hexadecimal Octal BCD Exceso 3 Gray o Reflejado
0000
0000
0011
0000
0001
0001
0100
0001
0010
0010
0101
0011
0011
0011
0110
0010
0100
0100
0111
0110
0101
0101
1000
0111
0110
0110
1001
0101
0111
0111
1010
0100
1000
10
1000
1011
1100
1001
11
1001
1100
1101
10
1010
12
0001 0000
1111
11
1011
13
0001 0001
1110
12
1100
14
0001 0010
1010
13
1101
15
0001 0011
1011
14
1110
16
0001 0100
1001
15
1111
17
0001 0101
1000
0000 0010 2
0000 0100 2
0000 1000 2
10
0001 0000 2
10
20
16
0010 0000 2
20
40
32
0100 0000 2
40
100
64
1000 0000 2
80
200
128
Ahora nos fijamos en la ltima respuesta (1 R 20), significa que 1208/26/26 = 1 (ms algo pequeo), as que tenemos que poner un "1" en la posicin que vale "26 2"! Despus tenemos que poner 20 en la posicin que vale "26 1", y para terminar ponemos 12 en las unidades. Por qu? Porque lo que las divisiones nos dicen es que: 1208 = 46 26 + 12 As que 12 va en la posicin de las unidades, y a partir de ah seguimos con la primera potencia de 26: 46 = 1 26 + 20 (as que el 20 va en la posicin 26, y ponemos el 1 en la posicin 2626 column) Entonces, la respuesta es:
262
1
261
20
1s
12
Y si sustituimos los nmeros por letras, tenemos: Veamos si es correcto: 1 26 = 676 +20 26 = 520 +12 1 = 12 ==> Total: 1208
ATL
As que para cambiar de base un nmero entero haces divisiones sucesivas y escribes los resultados de derecha a izquierda Nota: si usas el sistema con A=0, entonces el cdigo ATL se convierte en B__ (compltalo t!)
C.CQR
DELPHI
Convertir nmero Entero a Binario: Recursivamente: function IntToBinRec(valor,digitos:integer):string; begin if digitos=0 then result:='' else begin if (valor AND (1 shl (digitos-1)))>0 then result:='1'+IntToBinRec(valor,digitos-1) else result:='0'+IntToBinRec(valor,digitos-1) end; end; Ejemplo de llamada: Label1.Caption:=IntToBinRec(207,8); Otra ms eficiente: function IntToBin(valor,digitos:integer):string; var resultado:string; i:integer; begin if digitos>32 then digitos:=32; Resultado:=''; i:=0; while i< digitos do begin if ((1 shl i) AND valor)>0 then Resultado:='1'+resultado else Resultado:='0'+resultado; inc(i); end; Result:=resultado; end; Ejemplo de llamada: Label1.Caption:=IntToBin(207,8); Y otra ms: function IntToBin(Value: LongInt;Size: Integer): String; var i: Integer; begin Result:=''; for i:=Size-1 downto 0 do Result:=Result+Chr(48+Integer((Value and (1 shl i))<>0)); end;
0000 -> 0 0001 -> 1 0010 -> 2 ... 1110 -> E 1111 -> F Despues de haber obtenido esto, con la funciona StrToInt conviertes la cadena en valor hexadecimal a entero. Lleva trabajo de codificicion pero no es dificil. Quedaria algo asi: 10101001010111010111 -> A95D7 IntToStr('$' + 'A95D7'); Y ya te sale el valor decimal. Espero que ter sirva. Un saludo. Diego -> chairman function BinToInt(const Bin: string): Integer; // Cardinal si la cadena es de 32 bits var i: Integer; begin Result:= 0; for i:= 1 to Length(Bin) do Result:= Result*2 + Ord(Bin[i]) - Ord('0'); end; ninguna DE las 2 me a servido . un ejemplo q lo q quiero es convertir 11001000000010010111101000000100 y el resultado seria 3356064260 GRACIAS DE TODOS MODOS CHAO Siento contradecirte pero he probado el ejemplo que has puesto y lo calcula perferctamente. Recuerda que como la cadena es de 32bits el resultado de la funcin debe ser Cardinal y no Integer.
a) Suma de potencia de 2 Hacemos una tabla como la de Estrcuturas Abstractas de Datos en binario. 2^n (Dos a la n potencia) Siempre empezaremos con el 0 (cero) que sera el primero de derecha a izquierda, el siguiente sera dos, quedaria algo asi: 21 Si aadimos el siguiente numero que es 4 quedaria: 421 y asi sucesivamente hasta llegar a un numero x, que sepamos que supera nuestro numero, por ejemplo el 10. 2^0 = 1 2^1 = 2 2^2 = 4 2^3 = 8
8421 Sabemos que si sumamos todos los resultados da mas de 50. Entonces tenemos que hacer una combinacion de esto para que den 50 exactos, y esto seria: 8+2 = 10 Al convertirlo a un numero Binario, se dice esta formado por 0 y 1s, para hacerlo seria asi: Sabemos que NO ocupa el 1 para que la suma sea 10 entonces le ponemos un 0 Sabemos que SI ocupa el 2 para que la suma sea 10 entonces le ponemos un 1 Sabemos que NO ocupa el 4 para que la suma sea 10 entonces le ponemos un 0 Sabemos que SI ocupa el 8 para que la suma sea 10 entonces le ponemos un 1
Si ponemos atencin sabemos que ya hemos completado el 10, entonces para ordenarlos quedaria: Primero el del numero 8 (que es 1), luego el del 4 (que es 0), luego 2 (que es 1) y por ultimo el 1 (que es 0), y queda asi : 1010 8+0+2+0 =10
32 16 8 4 2 1 Sabemos que pasan sumando 50, ahora buscamos la combinacion: 32+16+2 = 50 Ahora sustituimos 0 en los numeros que no ocupamos y 1s en los que si. 110010 32+16+0+0+2+0 = 50 Y queda representado : 50 = 110010
Con un poco de practica se pueden comer muchos pasos y hacerlo mas rapido. b)Por divisin repetida entre dos Se divide el nmero repetidamente entre 2 y conservando los residuos hasta que se obtenga un cociente 0, el primer residuo es el LSB (Bit menos significante) y el ltimo es el MSB (Bit mas significante). Ejemplo: 10
10/2 = 05 con residuo 0 <--- LSB 05/2 = 02 con residuo 1 02/2 = 01 con residuo 0 01/2 = 00 con residuo 1 <--- MSB Al momento de ordenarlo sera primero el MSB, que en este caso es 1, despues el anterior que es 0, y asi hasta llegar al LSB que este caso es 0. Quedaria asi: 1010
Ahora veamos con otro numero: 50/2 = 25 residuo 0 <--- LSB 25/2 = 12 residuo 1 12/2 = 06 residuo 0 06/2 = 03 residuo 0 03/2 = 01 residuo 1 01/2 = 00 residuo 1 <--- MSB Los ordenamos del MSB al LSB y quedaria de la siguiente forma : 110010
El siguiente programa transforma de Binario a Decimal : Nombre: Binario a Decimal Extensin : .C /* Programa sacado del rincondelc */ #include #include #define VAL_MIN 0 #define VAL_MAX 1111 int es_binario(int num); int main(void){ int numero = 0; printf("Introduce un numero binario:"); scanf("%d", &numero); if (es_binario(numero)) printf("\nEl numero %d es binario\n", numero); else printf("\nEl numero %d no es binario\n", numero); return EXIT_SUCCESS; } int es_binario(int num){ if ((num <> VAL_MAX)) return 0; do { if ((num%10 != 0) && (num%10 != 1)) return 0; } while ((num /= 10) > 0); return 1; }
Decimal a Binario
Por:Blag, enviado 12 ene 2005 Ver todos los aportes de Blag
Este es un pequeo proyecto que comenc hace algn tiempo. Quera hacer un programa sencillo, pero til a la vez, y poder mostrarlo en diferentes lenguajes de programacin. Hasta el momento, estos son los lenguajes, los cuales se encuentran separados por carpetas, cada una con el nombre del lenguaje a la que pertenecen. PHP PASCAL QBASIC JavaScript C++ D++ EUPHORIA VB.NET EN CONSOLA C# EN CONSOLA JAVA DELPHI TCL ASP.NET H2O
Aqu una muestra en PHP, C++ y Java, puedes descargar el codigo fuente del resto en el enlace mas abajo.
PHP
1. <?
2. $suma=0;$digito=0;$exponente=0;
3.
5. if(isset($numero))
6. {
7.
$suma = 0;
8.
$exponente = 1;
9.
10.
$digito = $numero % 2;
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22. }
23. ?>
24. <html>
25. <head><title>Prueba</title></head>
26. <body>
28.
29.
30. </form>
31. </body>
32. </html>
Decimal/Binario/Hexadecimal
Buenos dias amigos del club delphi necesito hacer un programa en aplicacion tipo consola que me lea un numero en cualquiera de las tres bases (decimal/binario/hexadecimal) y me las convierta en sus equivalentes de las otras dos bases.
Nada mas he empezado con el codigo de decimal a binario pero tengo problemas convirtiendo de decimal a hexadecimal si alguien me pudiera ayudar con eso seria excelente y con las otras conversiones empezando de base hexadecimal o con base binaria.
Cdigo Delphi [-] cbin:=0; repeat dig:=aux mod 2; cbin:=dig+cbin*10; aux:=aux div 2; until aux=0; cv:=0; Repeat v:=cbin mod 10; cv:=v+cv*10; cbin:=cbin div 10; Until cbin=0; Writeln(cv); // Este es el numero en binario aux:=pr; chex:=0; repeat dig:=aux mod 16; chex:=dig+chex*10; aux:=aux div 16; until aux=0; Writeln(chex); cv:=0; Repeat v:=chex mod 10; cv:=v+10*cv; chex:=chex div 10; Until chex=0; Writeln(cv);
cv seria el numero al cual tendria que convertir en hexadecimal haciendo una comporacion de sus digitos y pasandolo a sus equivalentes hexadecimales pero no se como escribir esa comparacion porque por ejemplo el numero 123 en decimal seria 7B, si meto ese numero en el programa cv seria igual a 711 lo cual en equivalente a hexadecimal me daria mi 7B pero como hago para que me identifique cuando convierto el 11 a una B en vez de dos 1? Si no se entiende la explicacion escriban por favor que es urgente tengo hasta hoy en la noche para mandar ese programa. Hola Yo uso esta funcion: De Hexa a Binario:
Cdigo Delphi [-] function HextoBin(Hexadecimal:string):string; const BCD: array [0..15] of string= ('0000','0001','0010','0011','0100','0101','0110','0111', '1000','1001','1010','1011','1100','1101','1110','1111'); var i:integer; begin for i:=Length(Hexadecimal) downto 1 do Result:=BCD[StrToInt('$'+Hexadecimal[i])]+Result; end; ejemplo de llamada:
De binario a hexa
Cdigo Delphi [-] function BinToHex(Binario:string):string; const BCD: array [0..15] of string= ('0000','0001','0010','0011','0100','0101','0110','0111', '1000','1001','1010','1011','1100','1101','1110','1111'); HEX: array [0..15] of char= ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); var i,n:integer; sTemp:string; sNibble:string; begin Result:=''; sTemp:=Binario+Copy('000',1,Length(Binario) mod 4); for i:=0 to (Length(Binario) shr 2)-1 do begin sNibble:=Copy(sTemp,(i shl 2)+1,4); n:=8; while (sNibble <> BCD[n]) do if sNibble < BCD[n] then Dec(n) else Inc(n); Result:=Result+HEX[n]; end; end; Llamada
Saludos Augusto