Operar a Nivel de Bits (Operaciones Lógicas a Nivel de Bit)

6
Lo + nuevo Visual Basic 6 <Xaml /> HTML / Scripts ASP.NET Cómo en .NET ADO.NET Lenguajes .NET Foros Windows Colaboraciones el Guille , la Web del Visual Basic, C#, .NET y más... Buscar Donativo para el sitio de elGuille Buscar en Google y en elGuille.info: Búsqueda personalizada Cómo... en .NET Operar a nivel de bits (operaciones lógicas a nivel de bit) Publicado el 12/May/2008 Actualizado el 12/May/2008 Autor: Guillermo 'guille' Som En este artículo te explico cómo operar con valores a nivel de bits, para hacer operaciones con los operadores AND, OR, NOT y XOR. Y para ver cómo funcionan estos valores a niveles de bits, te pongo un ejemplo para acceder a los atributos de los ficheros. Y como de costumbre, con código para Visual Basic y C#.

description

VB6 , operaciones binarias

Transcript of Operar a Nivel de Bits (Operaciones Lógicas a Nivel de Bit)

  • 13/5/2015 Operar a nivel de bits (operaciones lgicas a nivel de bit)

    http://www.elguille.info/NET/dotnet/operar_con_bits.aspx 1/6

    Lo + nuevo Visual Basic 6 HTML / Scripts

    ASP.NET Cmo en .NET ADO.NET

    Lenguajes .NET Foros Windows Colaboraciones

    el Guille, la Web del Visual Basic, C#, .NET y ms...

    Buscar

    Donativo para el sitio de elGuille

    Buscar en Google y en elGuille.info:

    Bsquedapersonalizada

    Cmo... en .NET

    Operar a nivel de bits(operaciones lgicas a nivel de bit)

    Publicado el 12/May/2008Actualizado el 12/May/2008Autor: Guillermo 'guille' Som

    En este artculo te explico cmo operar con valores a nivel de bits, para hacer operaciones con los operadores AND, OR, NOT yXOR. Y para ver cmo funcionan estos valores a niveles de bits, te pongo un ejemplo para acceder a los atributos de losficheros. Y como de costumbre, con cdigo para Visual Basic y C#.

  • 13/5/2015 Operar a nivel de bits (operaciones lgicas a nivel de bit)

    http://www.elguille.info/NET/dotnet/operar_con_bits.aspx 2/6

    Introduccin con batallita del agelo incluida:

    Este tipo de operaciones "lgicas" no son muy habituales, pero seguro que te las encontrars ms de una vez.

    Si te contara una batallita te dira que..., vale!, pues te la cuento, total, esto que te voy a explicar se explica en cuatrolneas.

    En "mis tiempos", debido a que tenamos que ahorrar memoria y espacio en disco, (por si no lo sabes, en los primerostiempos de los PC-Compatibles los discos eran de 360 KB y haba que aprovechar bien el contenido), haba veces que enlugar de guardar valores normales, lo que hacamos era almacenar valores que tenan ciertos bits conectados o no, ydependiendo de ese estado se haca una cosa u otra. Por ejemplo, con una cadena de 1024 bytes poda controlar elestado 8192 registros, en mi caso eran valores que estaban guardados en el disco, y de esta forma, sabiendo si el bitestaba a uno o a cero saba si en ese "registro" haba informacin o no. Ahora esto es casi intil hacerlo, ya que no hayproblemas, ni de almacenamiento ni de velocidad, pero... en fin...

    Pues eso, un byte son 8 bits y cuando trabajamos a nivel de bits lo que hacemos es trabajar a nivel binario, y a ese nivelsolo existen dos valores posibles: cero y uno.

    Cuando quieres trabajar con esos valores, puedes hacerlo usando lo que se conoce como aritmtica binaria (o a nivel debits).

    Por ejemplo, si sumas uno al valor 3 tienes un 4. Esto es de primaria, pero si te lo digo en binario, ya no es tan "lgico" nievidente:

    0011 + 0001 = 0100. Est fcil? Pues no tanto... salvo que sepas sumar solo con dos dedos ;-)))

    De todas formas te explico lo que ha ocurrido. Empezando a operar con los valores desde la derecha (segn se mira lapantalla):

    00110001----0100

    1 + 1 = 0 y me llevo 1 (ya que el 2 decimal sera el 10 binario). 1 + 0 + 1 = 0 y me llevo 1.0 + 0 + 1 = 1. 0 + 0 = 0. Y unindolo todo, tenemos 0100.

    Pero esto no es el tema de lo que te quera contar, pero para que vayas viendo cunto nos podemos complicar si nossalimos del sistema decimal (o base 10).

    El tema que te quera contar era operar con esos bits haciendo operaciones "lgicas", es decir, usando los operadores OR,AND, NOT y XOR. Los pongo as en maysculas para que te sirva tanto para Visual Basic como para C#, aunque en loslenguajes que tienen su raz en C, son ms complicados para estas cosas (tan evidentes), por ejemplo, en esos lenguajesde la familia C, para la operacin AND a nivel de bit se utiliza el smbolo &. Para realizar una operacin OR se usa |. Pararealizar una operacin NOT se usa !. Y para usar una operacin XOR se usa ^. XOR es OR exclusivo.

    Si queremos operar a nivel de bits, podemos usar esas cuatro operaciones que en la siguiente tabla tienes el resultadoobtenido al operar con cada una de las posibilidades que nos da el sistema binario.

    HSBC Banca de EmpresasHangouts en directo

    Jue., 7 de mayo, 17:30

    35 9 Ampliar

    De la empresa familiar al mundo

  • 13/5/2015 Operar a nivel de bits (operaciones lgicas a nivel de bit)

    http://www.elguille.info/NET/dotnet/operar_con_bits.aspx 3/6

    Para cada tipo de operacin en la parte de la izquierda tienes la operacin usando los valores Boolean, en la parte de laderecha tienes los valores de las operaciones a nivel de bits.

    Nota para los de C#:El operador And es & Or es | Not es !Xor es ^

    AND Devuelve un valor verdadero, si las dos expresiones devuelven un valor verdadero.

    True And True = True (1 And 1 = 1)True And False = False (1 And 0 = 0)False And True = False (0 And 1 = 0)False And False = False (0 And 0 = 0)

    NOT Niega (o invierte) el valor devuelto por la expresin.

    Not True = False (Not 1 = 0)Not False = True (Not 0 = 1)

    OR Devuelve un valor verdadero si cualquiera de las dos expresiones es verdadera.

    True Or True = True (1 Or 1 = 1)True Or False = True (1 Or 0 = 1)False Or True = True (0 Or 1 = 1)False Or False = False (0 Or 0 = 0)

    XOR Devuelve un valor verdadero solamente si una de las expresiones es verdadera.

    True Xor True = False (1 Xor 1 = 0)True Xor False = True (1 Xor 0 = 1)False Xor True = True (0 Xor 1 = 1)False Xor False = False (0 Xor 0 = 0)

    Tabla 1. Operaciones binarias a nivel lgico y a nivel de bits.

    Seguramente dirs: Vale, mu bonito... y?Pues... a ver... si por un lado tienes el valor 3 (que en binario es 0011) y por otro tienes el valor 10 (que en binario es1010) y le aplicas estos operadores tendrs:

    0011 (3)Or 1010 (10)-------- 1011 (11)

    0011 (3)And 1010 (10)-------- 0010 (2)

    0011 (3)Xor 1010 (10)-------- 1001 (9)

  • 13/5/2015 Operar a nivel de bits (operaciones lgicas a nivel de bit)

    http://www.elguille.info/NET/dotnet/operar_con_bits.aspx 4/6

    Debes tener en cuenta que para los valores binarios, la posicin que ocupa es la que le da el valor, por ejemplo para 8 bits(1 byte), tenemos estas posiciones y los valores correspondientes a cada bit:

    Bit 8 7 6 5 4 3 2 1Valor 128 64 32 16 8 4 2 1

    En realidad cada valor se corresponde con 2 elevado a la posicin, por ejemplo: 2 elevado a 8 = 128.

    Por tanto, si tenemos el valor del 9 (00001001), tenemos un 1 en la posicin del valor 8 y otro en la posicin del valor 1:

    Bit 8 7 6 5 4 3 2 1Valor 128 64 32 16 8 4 2 1 0 0 0 0 1 0 0 1

    Que valor tendr este nmero?

    Bit 8 7 6 5 4 3 2 1 1 0 1 0 1 0 1 0

    Pues: 128 + 32 + 8 + 2 = 170 (resalta desde el principio para ver la respuesta)

    Para que sirve todo esto?

    Pues para operar a niveles de bits.Ah... te refieres de forma prctica?

    Por ejemplo cuando trabajas con valores de una enumeracin que tiene el atributo Flags y cuyos valores se correspondancon valores binarios, por ejemplo, que un valor sea 1, el siguiente 2, el siguiente 4 y el siguiente 8, etc. Es decir 2 elevadoa la potencia de la posicin que ocupa, que es en realidad el valor que tiene cada bit del nmero mostrado antes.

    Como algo prctico, los valores de los atributos de los ficheros (o directorios) suelen tener valores de este tipo.Por ejemplo, si es un directorio tiene activado el bit correspondiente al valor 16 (el bit de la posicin 5).Si est oculto el bit que tendr activado es el 2. Por tanto, si el valor del atributo que tiene un directorio es 18 ser porque es un directorio (16) y est oculto (2).El valor 18 en binario sera: 10010

    Y con el AND podemos saber si un bit en cuestin est activado, ya que si hacemos esta comparacin:Valor And Posicin = Posicin (para C#, sera: Valor & Posicin == Posicin)Y se cumple, querr decir que Valor tiene el valor indicado por Posicin.

    Vale, mejor con algo prctico.

    Si tenemos el siguiente cdigo, podemos saber si ese fichero est oculto:

    DimatrAsFileAttributes=File.GetAttributes(fic)

    If(atrAndFileAttributes.Hidden)=FileAttributes.HiddenThen'EstocultoElse'NoestocultoEndIf

    FileAttributesatr=File.GetAttributes(s)

    if((atr&FileAttributes.Hidden)==FileAttributes.Hidden){//Estoculto}else{//Noestoculto}

  • 13/5/2015 Operar a nivel de bits (operaciones lgicas a nivel de bit)

    http://www.elguille.info/NET/dotnet/operar_con_bits.aspx 5/6

    Por qu funciona esto como funciona?

    Cuando haces un AND ests devolviendo todos los bits que en ambos lados estn a 1, y como trabajamos con valores quesiempre tienen activado un bit (si no se trabajara as, esto no funcionara), se comprueba si al hacer el AND obtenemos elmismo valor, es que ese "bit" est en el valor total del atributo.

    Es decir, el atributo Hidden tiene un valor 2. El atributo Directory tiene un valor 16. El atributo System vale 4. Elatributo ReadOnly vale 1. Y as sucesivamente.

    Por tanto, si es un directorio oculto, del sistema y de solo lectura qu valor tendr?16 + 2 + 4 + 1 = 23 que en binario es:

    Bit 8 7 6 5 4 3 2 1Valor 128 64 32 16 8 4 2 1 0 0 0 1 0 1 1 1

    Nota sobre OR y la suma:

    La operacin OR a nivel de bit se puede sustituir por una operacin de suma, pero solo tendr sentido "decimal" si losvalores que sumamos son valores exactos (a nivel de bits), por ejemplo, sumar 8 + 2 es lo mismo que hacer 8 Or 2, que enambos casos dar como resultado 10.

    Pero si los valores a sumar no representan valores exactos a nivel de bits, no producir el mismo resultado.Por ejemplo 10 + 3 no es lo mismo que 10 Or 3, ya que al sumar ser 13, pero al hacer Or ser 11.La explicacin es porque 10 es: 1010 que al hacer OR con 0011 tenemos 1011 (el ejemplo que vimos al principio),mientras que 13 es: 1101.

    Esto lo digo para aquellos que han usado Visual Basic 6.0 o anterior (incluso con Visual Basic .NET y Option Strict Off), yaque Visual Basic permite usar la suma en lugar de OR para "ligar" valores que tienen valores binarios, pero como acabamosde ver esa suma solo se podr hacer con valores binarios exactos.

    Espero que te haya quedado claro y que de alguna forma te sea de utilidad.

    Nos vemos.Guillermo

    Cdigo de ejemplo (comprimido):

    No hay proyecto de ejemplos, todo el cdigo est en el artculo.

    Cosas que te pueden interesar

    Te gusta programar? Si te gusta programar por programar, este es tu sitio El blog del Guille: : elGuille mola Firmas invitadas (artculos que no puedes perderte) Novedades de Visual Basic 9.0 Aprenda C# 3.0 desde 0.0 - Parte 3, lo nuevoTodas las novedades de C# 3.0, contadas al estilo del Guille

  • 13/5/2015 Operar a nivel de bits (operaciones lgicas a nivel de bit)

    http://www.elguille.info/NET/dotnet/operar_con_bits.aspx 6/6

    Mentor de

    MVP de Visual Basic desde 1997

    Los viajes del Guille Por si quieres saber por dnde ha estado el Guille dando charlas y dems... Los foros de el Guille (para que hagas consultas y veas lo que otros han preguntado) elGuille.Hosting (las ofertas de alojamiento de el Guille, posiblemente los mejores precios delmercado) Artculos del Guille publicados en dotNetMana (en formato PDF)

    Orador de Ineta Latam

    Escribir un mensaje al Guille (mensaje EN elGuille.info)

    Has entrado usando el host: www.elguille.infoPuedes verlo tambin en: http://www.mundoprogramacion.com/net/dotnet/operar_con_bits.aspx