Mostrando entradas con la etiqueta Definiciones. Mostrar todas las entradas
Mostrando entradas con la etiqueta Definiciones. Mostrar todas las entradas

1.5 Manejo de Bits

Como sabrán, los datos en una computadora internamente se representan en código binario. El microprocesador solo entiende de ceros y unos. Luego mediante una serie de procesos nosotros vemos a este código ya transformado en números, caracteres , imágenes y sonido. Pero en realidad en la trastienda todo sigue siendo binario.

Los Bits

El método mas sencillo de representación son los números naturales. Por ejemplo, si tengo el número 85 en decimal, solo tengo que llevarlo a binario y obtengo una serie de unos y ceros. :

1010101 = 85 en binario

Cada dígito (un cero o un uno) de este número se llama bit. Java tiene una serie de operadores capaces de manipular estos dígitos, son los operadores de bits.


Operador Utilización Resultado
<< A <<> Desplazamiento de A a la izquierda en
B posiciones
>> A >> B Desplazamiento de A a la derecha en
B posiciones, tiene en cuenta el signo.
>>> A >>> B Desplazamiento de A a la derecha en
B posiciones, no tiene en cuenta el signo.
& A & B Operación AND a nivel de bits
| A | B Operación OR a nivel de bits
^ A ^ B Operación XOR a nivel de bits
~ ~A Complemento de A a nivel de bits


Para operar a nivel de bit es necesario tomar toda la longitud predefinida para el tipo de dato. Estamos acostumbrados a desechar los ceros a la izquierda en nuestra representación de números. Pero aquí es importante. Si trabajamos una variable de tipo short con un valor de 3, está representada de la siguiente manera :

0000000000000011

Aquí los 16 bits de un short se tienen en cuenta.

Desplazamientos

Los operadores de desplazamiento, mueven los bits a la izquierda o a la derecha. El primer operando será la victima a sacudir. El segundo indicará cuantas posiciones.

Desplazamiento a la izquierda con signo (cíclico)

Deseamos correr el número 33 dos posiciones a la izquierda. Entonces realizamos :

int j = 33;
int k = j <<>

Como resultado obtenemos el número original.

00000000000000000000000010000100 : k = 132 00000000000000000000000000100001 : m = 132 >> 2 ; m = 33

Podemos ver que el corrimiento a la derecha realiza una división de enteros. Divide por 2, tantas veces como posiciones desplazadas. Los huecos que quedan por la izquierda se cubren con los bits que van saliendo por la derecha (es cíclico).

Veamos que ocurre si pretendemos realizar un desplazamiento a la derecha con un número negativo. Tengan en cuenta que la representación de números es de complemento a 2. Si tengo una variable de tipo int con el valor –1 , internamente está almacenada de la siguiente forma :

11111111111111111111111111111111 : -1 complemento a 2

Ahora realicemos un programa para ver que ocurre con el desplazamiento.

public class CorreNeg {
public static void main(String args[]){
int x = -1;
int y = x >> 2;
System.out.println("El resultado es: " + String.valueOf(y));
}
}

La salida del programa nos indica que:

El resultado es: -1

Quedó exactamente igual. Prueben de correr el número tantas posiciones como tengan ganas y obtendrán el mismo resultado. Esto ocurre porque en el desplazamiento, los "huecos" que quedan a la izquierda se rellenan con el bit uno (1), quedando inalterable.

Este operador desplaza el conjunto de bit a la derecha y agrega a la izquierda los bits que faltan según el signo. Si se encuentra con un número positivo, agrega ceros, en cambio si son negativos agrega unos. Se lo conoce como desplazamiento con signo.

Desplazamiento a la derecha sin signo

Modifiquemos ligeramente el programa anterior agregándole al operador un símbolo >. Nos queda de esta manera :

int x = -1;
int y = x >>> 2;

Si ejecutamos el programa nos dice lo siguiente :

El resultado es: 1073741823

Veamos de donde salió este número raro. Si lo llevamos a binario tenemos :

00111111111111111111111111111111 : 1073741823 en binario

Ahora nos damos cuenta que se han agregado dos ceros a la izquierda. Este operador desplaza a la derecha, pero no tiene en cuenta el signo. Siempre agrega bit con el valor cero, por lo que se llama desplazamiento sin signo.

Operadores lógicos de bits

Estos operadores extienden las operaciones booleanas a los enteros. Para comprender como trabajan debemos descomponer los enteros en un conjunto de bits. El operador aplicará una operación lógica bit por bit, tomando el valor de uno como verdadero y el valor de cero como falso. De un operando toma un bit y aplica la operación al bit que tiene la misma posición del segundo operando. Como resultado obtenemos otro entero.

Operador AND de Bits

Si ambos bits comparados son 1, establece el resultado en 1. De lo contrario da como resultado 0.

int k = 132; // k: 00000000000000000000000010000100
int l = 144; // l: 00000000000000000000000010010000
int m = k & l; // m: 00000000000000000000000010000000

El resultado da 128

Operador XOR de Bits

Si uno de los bits comparados es 0 y el otro 1, el resultado es 1. Si ambos bits comparados son iguales, el resultado es 0.

int k = 132; // k: 00000000000000000000000010000100
int l = 144; // l: 00000000000000000000000010010000
int m = k ^ l; // m: 00000000000000000000000000010100

El resultado da 20

Operador NOT de Bits

Sólo invierte los bits, es decir, convierte los ceros en unos y viceversa. Observemos que es el único de esta familia que tiene un solo operando.

int k = 132; // k: 00000000000000000000000010000100
int m = ~k; // m: 11111111111111111111111101111011

El resultado da -133

Como los enteros negativos en Java se representan con el método del complemento a dos, podemos realizar un sencillo experimento de cambiarle el signo a un número. Para realizarlo debemos aplicar a un entero el operador NOT y sumarle uno.

int x = 123;
int y = ~x;
int z = y + 1;

El resultado da -123,


Fuente Original:

http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_Java_/_Operadores_de_bits

Leer más...

1.4 Tipos de Datos Enumerados

Una enumeración o tipo enumerado es un tipo especial de estructura en la que los literales de los valores que pueden tomar sus objetos se indican explícitamente al definirla. Por ejemplo, una enumeración de nombre Tamaño cuyos objetos pudiesen tomar los valores literales Pequeño, Mediano o Grande se definiría así:

enum Tamaño {
Pequeño,
Mediano,
Grande
}


Tipos enumerados. Un tipo enumerado o enumeración está construido por una serie de constantes simbólicas enteras. Los tipos enumerados se tratan de modo ligeramente diferente en C++ que en ANSI C. El nombre de la etiqueta enum se considera como un nombre de tipo igual que las etiquetas de struct y union. Por tanto se puede declarar una variable de enumeración, estructura o union sin utilizar las palabras enum, strcut o union. C define el tipo de enum de tipo int. En C++, sin embargo, cada tipo enumerado es su propio tipo independiente. Esto significa que C++ no permite que un valor int se convierta automáticamente a un valor enum. Sin embargo, un valor enumerado se puede utilizar en lugar de un int.

Ejemplo:

enum lugar{
primero,
segundo,
tercero
};

lugar pepe=primero; //correcto
int vencedor=pepe; //correcto
lugar juan=1; //incorrecto

La última sentencia de asignación es aceptable en C pero no en C++, ya que 1 no es un valor definido en lugar.

Elementos Basicos.

Ya sabemos que en los algoritmos aparecen objetos que tienen tres características:

Nombre.
Tipo.
Valor:
Variables.
Constantes.

Tipo:

• Define el conjunto de valores que puede tomar un determinado

Objeto:

• Determina las operaciones que se pueden aplicar a un objeto. • Define el espacio que será necesario reservar en memoria para albergar a un objeto. • Define la interpretación del valor almacenado en memoria.

Cardinalidad:

• Es el número de valores que tiene un tipo de datos. La simbolizaremos con ‘#’.

Operadores básicos:

• Aspecto práctico: manipulación de objetos.

Para ello a cada tipo de datos se le asocia un conjunto de operadores básicos. ¿Cuántos?, ¿cuáles?. Como criterio general: se le asocian aquellos que posibiliten al programador construir cualquier operación adicional, en función de los básicos, de una forma eficiente. • Un mismo símbolo (por ejemplo ‘+’) puede utilizarse como operador para distintos tipos de datos. Esto se denomina “sobrecarga”.

Tipos de datos simples

Compatibilidad de tipo:

• Los operadores tienen que aplicarse a objetos de tipos de datos compatibles (iguales o no). • La información del tipo de dato ayuda a los compiladores a detectar operaciones inapropiadas con tipos de datos no compatibles. • Hay lenguajes de programación más estrictos que otros en cuanto al chequeo de tipos. • En nuestro pseudolenguaje seremos lo más flexible posible, pero tendiendo a aplicar operadores a tipos de datos iguales, con el fin de evitar posibles errores de diseño.

Declaración de constantes y variables en nuestro pseudo lenguaje:

Constantes nombre = valor Variables nombre : Tipo

Clasificacion de tipos de datos simples:

• Tipos simples: Predefinidos (N, Z, R, C, B)

Definidos por el programador (enumerado y subrango)

• Tipos estructurados. Arrays Cadenas de Caracteres

--
Fuente Original:

http://www.mitecnologico.com/Main/TiposDeDatosEnumerados
Leer más...

1.3 Registros Variantes

Los registros variantes son una especie de sentencia “case” dentro de un registro y son muy útiles cuando tenemos ciertos atributos que sabemos de antemano que sólo usaremos en ciertas situaciones.

Los registros variantes ahorran memoria, porque como sólo una de las estructuras debidas dentro de ellos puede usarse a la vez, el compilador sólo necesita reservar memoria para la mayor de ellas (en vez de tener que hacerlo para todos los componentes del registro).

Registros Variantes Esta propiedad de compartición de espacio en memoria es similar a la de los bloques disjuntos en ALGOL. De hecho, también en el caso de los registros variantes se permite el anidamiento.

Por tanto, los registros variantes son muy eficientes y seguros, porque sólo permiten al programador realizar operaciones que tengan algún significado dentro del contexto dado y que sean permisibles dentro del registro.

Sin embargo, el problema con esta estructura de datos es que no requiere ser inicializada. Esto significa que podríamos tener cualquier valor dentro de un registro variante después de modificar el valor de un campo identificador.

El acceso a variables no inicializadas puede dar lugar a que se usen valores que fueron dejados previamente en el bloque y que compartían la misma zona de memoria. En el caso de los registros variantes, este valor puede incluso ser de un tipo diferente al esperado.

La raíz del problema es que los registros variantes permiten una forma de “aliasing”, ya que los campos de las diferentes variantes son todos “alias” de las mismas posiciones de memoria.

He aquí un archvivo que nos habla sobre los registros variantes dale click aquí para descargar.

"Proximamente subiremos pequeños programas para ejemplificar mejor lo temas, revisa en la siguiente dirección http://geeksmarts.4shared.com ahí podrás descargar el material que vayamos subiendo."

Leer más...

Programación Multihebra

Dentro de la clase en algún momento requeriremos de la programación multihebra o multihilo, en este blog tenemos publicado un manual que nos habla en especifico de este tema y nos da ejemplos muy sencillos que podemos poner en práctica a continuación se muestra el PDF.

Descarga el archivo dando click aquí.

Por el momento aquí le dejo un la definición y un ejemplo de lo que es un hilo (hebra) en programación:


Hilo de ejecución

Un hilo de ejecución, en sistemas operativos, es una característica que permite a una aplicación realizar varias tareas concurrentemente. Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, etc. Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente.

Los hilos de ejecución que comparten los mismos recursos, sumados a estos recursos, son en conjunto conocidos como un proceso. El hecho de que los hilos de ejecución de un mismo proceso compartan los recursos hace que cualquiera de estos hilos pueda modificar éstos. Cuando un hilo modifica un dato en la memoria, los otros hilos acceden e ese dato modificado inmediatamente.

Lo que es propio de cada hilo es el contador de programa, la pila de ejecución y el estado de la CPU (incluyendo el valor de los registros).

El proceso sigue en ejecución mientras al menos uno de sus hilos de ejecución siga activo. Cuando el proceso finaliza, todos sus hilos de ejecución también han terminado. Asimismo en el momento en el que todos los hilos de ejecución finalizan, el proceso no existe más y todos sus recursos son liberados.

Algunos lenguajes de programación tienen características de diseño expresamente creadas para permitir a los programadores lidiar con hilos de ejecución (como Java o Delphi). Otros (la mayoría) desconocen la existencia de hilos de ejecución y éstos deben ser creados mediante llamadas de biblioteca especiales que dependen del sistema operativo en el que estos lenguajes están siendo utilizados (como es el caso del C y del C++).

Un ejemplo de la utilización de hilos es tener un hilo atento a la interfaz gráfica (iconos, botones, ventanas), mientras otro hilo hace una larga operación internamente. De esta manera el programa responde de manera más ágil a la interacción con el usuario. También pueden ser utilizados por una aplicación servidora para dar servicio a múltiples clientes.


Diferencias entre hilos y procesos

Los hilos se distinguen de los tradicionales procesos en que los procesos son –generalmente– independientes, llevan bastante información de estados, e interactúan sólo a través de mecanismos de comunicación dados por el sistema. Por otra parte, muchos hilos generalmente comparten otros recursos de forma directa. En muchos de los sistemas operativos que dan facilidades a los hilos, es más rápido cambiar de un hilo a otro dentro del mismo proceso, que cambiar de un proceso a otro. Este fenómeno se debe a que los hilos comparten datos y espacios de direcciones, mientras que los procesos, al ser independientes, no lo hacen. Al cambiar de un proceso a otro el sistema operativo (mediante el dispatcher) genera lo que se conoce como overhead, que es tiempo desperdiciado por el procesador para realizar un cambio de modo (mode switch), en este caso pasar del estado de ejecución (running) al estado de espera (waiting) y colocar el nuevo proceso en ejecución. En los hilos, como pertenecen a un mismo proceso, al realizar un cambio de hilo el tiempo perdido es casi despreciable.

Sistemas operativos como Windows NT, OS/2 y Linux (2.5 o superiores) dicen tener hilos "baratos", y procesos "costosos" mientras que en otros sistemas no hay una gran diferencia.

Fuente Original:
http://es.wikipedia.org/wiki/Hilo_en_sistemas_operativos

Leer más...

¿Qué es la Teoría de la Computación?

La teoría de la computación es una ciencia, en particular una rama de la matemática y de la computación que centra su interés en el estudio y definición formal de los cómputos.

Se le llama cómputo a la obtención de una solución o resultado (generalmente en el sentido matemático/aritmético del término), a partir de ciertos datos o entradas utilizando para ello un proceso o algoritmo. (De Wikipedia, la enciclopedia libre)

Logo_foro_1.gif Leer más...

¿Qué es Java?

Java es un lenguaje originalmente desarrollado por un grupo de ingenieros de Sun, utilizado por Netscape posteriormente como base para Javascript. Si bien su uso se destaca en el Web, sirve para crear todo tipo de aplicaciones (locales, intranet o internet). (Java desde Cero)

Logo_foro_1.gif

Leer más...

Java y JavaScript

- JavaScript es una versión de Java directamente interpretada, que se incluye como parte de una página HTML, lo que lo hace muy fácil y cómodo para aplicaciones muy pequeñas, pero que en realidad tiene muchas limitaciones. La principal limitación es que no todos los browsers lo soportan completamente (Explorer, por ejemplo, no soporta las últimas adiciones de Netscape, como las imágenes animadas).

- JavaScript es un lenguaje creado por Netscape y Sun.


- VBScript (Visual Basic Script) es una copia mejorada de JavaScript creada por Microsoft (en continua guerra con Netscape), que sólo funciona con su navegador (Microsoft Internet Explorer).


- JavaScript se le ha llamado el hermano pequeño de Java, pero es bastante menos que eso, ya que Java es un lenguaje de programación general a diferencia de JavaScript, que sólo sirve para añadir interactividad a las páginas web.


- JavaScript sólo se puede comparar (salvando las distáncias) con los applets de Java.



Más información de esto en:


Manual de JAVA 2

Logo_foro_1.gif

Leer más...

Autómata finito

Un autómata finito o máquina de estado finito es un modelo matemático de un sistema que recibe una cadena constituida por símbolos de un alfabeto y determina si esa cadena pertenece al lenguaje que el autómata reconoce.

Definición formal

Formalmente, un autómata finito (AF) puede ser descrito como una 5-tupla (S,Σ,T,s,A) donde:

  • S un conjunto de estados;
  • Σ es un alfabeto;
  • T es la función de transición: T: S \times ( \Sigma \cup \{\epsilon\})\to \mathcal{P}(S);
  • s \in S es el estado inicial;
  • A \subseteq S es un conjunto de estados de aceptación o finales.

Ejemplo 1

  • S = {S1, S2},
  • Σ = {0,1},
  • T = {(S1,0,{S2});(S1,1,{S1});(S2,0,{S1});(S2,1,{S2})}
  • s = S1
  • A = {S1}.

Formas de representar un autómata finito

Además de notar un AF a través de su definición formal es posible representarlo a través de otras notaciones que resultan más cómodas. Entre estas notaciones, las más usuales son:

  • Las Tablas de Transiciones: la tabla de transición para el AF del ejemplo 1 es



0
1
S1 S2 S1
S2 S1 S2


  • Los Diagramas de Transiciones: el diagrama de transición para el AF del ejemplo 1 es

Imagen:DFAexample.svg

  • Las Expresiones regulares. Se demuestra que dado un autómata de estados finitos, existe una expresión regular que lo representa.

Ø υ 1* υ (1* ο 0 ο 1* ο 0)*

Más información en:

http://es.wikipedia.org/wiki/Aut%C3%B3mata_finito#Definici.C3.B3n_formal

Logo_foro_1.gif Leer más...

Lenguaje Formal

En matemáticas, lógica, y ciencias de la computación, un lenguaje formal es un conjunto de palabras (cadenas de caracteres) de longitud finita formadas a partir de un alfabeto (conjunto de caracteres) finito. El nombre lenguaje se justifica porque las estructuras que con este se forman tienen reglas de buena formación (gramática) e interpretación semántica (significado) en una forma muy similar a los lenguajes hablados.

Un posible alfabeto sería, digamos, \{ a, b\}\, , y una cadena cualquiera sobre este alfabeto sería, por ejemplo, ababba\,. Un lenguaje sobre este alfabeto, que incluyera esta cadena, sería: el conjunto de todas las cadenas que contienen el mismo número de símbolos a \, que b \,, por ejemplo.

La palabra vacía (esto es, la cadena de longitud cero) se permite en este tipo de lenguajes, notándose frecuentemente mediante \epsilon \,, e\, ó \lambda \,. A diferencia de que ocurre con el alfabeto (que es un conjunto finito) y con cada palabra (que tiene una longitud también finita), un lenguaje puede estar compuesto por un número infinito de palabras.

Sigue leyendo en Wikipedia:
http://es.wikipedia.org/wiki/Lenguaje_formal

Logo_foro_1.gif Leer más...

Inducción Matemática

La inducción es un razonamiento que permite demostrar una infinidad de proposiciones, o una proposición que depende de un parámetro n que toma una infinidad de valores, usualmente en el conjunto de los enteros naturales ℕ.

El esquema del razonamiento es el siguiente: Llamemos Pn la proposición al rango n.

* Se demuestra que P0 es cierta (iniciación de la inducción).
* Se demuestra que si se asume Pn como cierta, entonces Pn+1 lo es también, y esto sin condición sobre el entero natural n. (relación de inducción).

Sigue leyendo en Wikipedia:
http://es.wikipedia.org/wiki/Inducci%C3%B3n_matem%C3%A1tica

Descargate este libro de Inducción Matemática, con ejercicios y mucho material de estudio:
Inducción Matemática

Logo_foro_1.gif Leer más...

Terminos y Definiciones

A continuación les enlisto algunos enlaces que les pueden ser de utilidad para la materia, deben saber que en teoria de la computación se debe conocer bien el concepto de conjuntos y algunas otras operaciones matematicas, para comprender los denominados lenguajes formales:
Logo_foro_1.gif Leer más...