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