Foros del Web » Programación para mayores de 30 ;) » C/C++ »

GetLogicalDrives y AND binario

Estas en el tema de GetLogicalDrives y AND binario en el foro de C/C++ en Foros del Web. Alguien sabria decirme como se manejan los bits que devuelve GetLogicalDrives() con un & (and binario), en este caso con el valor potencia ¿Tiene algo ...
  #1 (permalink)  
Antiguo 19/05/2010, 18:51
 
Fecha de Ingreso: mayo-2010
Mensajes: 4
Antigüedad: 13 años, 11 meses
Puntos: 0
GetLogicalDrives y AND binario

Alguien sabria decirme como se manejan los bits que devuelve GetLogicalDrives() con un & (and binario), en este caso con el valor potencia ¿Tiene algo que ver con algun tipo de desplazamiento?

int potencia,info;
primero=false
{..}
info=GetLogicalDrives();
for (int i=1; i<32; i++)
{
potencia=int(pow(2,i));
if((info & potencia)!=0)
{
printf("%c:%c ",i+65,92);
if (!primero)
{
prim=i+65;
primero=true;
}
sec=i+65;
}
  #2 (permalink)  
Antiguo 21/05/2010, 06:21
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: GetLogicalDrives y AND binario

La potencia representa la mascara necesaria para usando el AND con cada bit saber si la unidad existe o no.
Hay un error minimo en el programa y es empezar el bucle con i siendo 1, de esa manera nunca se comprueba si A esta disponible o no.

En la variable info se guarda la mascara de bits con todas las unidades, por ejemplo:
0x0000005D

En ese caso el programa muestra (falta A:\ por lo que explique antes):
C:\ D:\ E:\ G:\

Hagamoslo a mano:
0x0000005D es 01011101 en binario.

Como podemos ver el primer bit (el menos significante, ver MSDN) tiene como valor 1. Eso quiere decir que la unidad A esta disponible. El segundo bit tiene como valor 0 asi que B no esta disponible, el tercero tiene como valor 1 asi que C esta disponible y asi sucesivamente.


¿Como hace el programa para comprobar si la unidad esta disponible? Primero calcula la mascara necesaria y despues hace la operacion AND. La mascara se calcula mediante la potencia de 2 a la i (numero de unidad).

Entonces: 2 ^ 0 = 1, 2 ^ 1 = 2, 2 ^ 2 = 4, etc.

Si quedamos en que info es 0x0000005D, tenemos que la primera pasada (inicializando a i como 0) hara esto:

0x0000005D & 0x1, el resultado es 0x1 y por lo tanto la unidad esta disponible.

La segunda pasada:
0x0000005D & 0x2, el resultado es 0 y por lo tanto la unidad no esta disponible.

Tercera pasada:
0x0000005D & 0x4, el resultado es 0x4 y por lo tanto la unidad esta disponible.


Y asi sucesivamente, si cambias la inicializacion del bucle for de i=1 a i=0 entonces el programa mostrara correctamente A.


Si todavia no te queda claro lo de las mascaras lee esto sobre AND que explica con bits:
http://en.wikipedia.org/wiki/Bitwise_operation#AND
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Etiquetas: binario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:38.