Python GetLogicalDrives побитовое И

У меня есть несколько вопросов по поводу следующего кода.

from win32 import win32file
drives = []
drivebits=win32file.GetLogicalDrives()
for d in range(1,26):

    mask=1 << d
    if drivebits & mask:
        drname='%c:\\' % chr(ord('A')+d)
        t=win32file.GetDriveType(drname)
        if t == win32file.DRIVE_REMOVABLE:
            drives.append(drname)
print(drives)

1-Когда вы используете GetLogicalDrives из модуля win32, он возвращает целое число. Может кто-нибудь объяснить, почему?

2-Почему диапазон цикла составляет от 1 до 26?

3-В чем причина побитового И?

Спасибо

1 ответ

Решение

win32 Модуль - это действительно низкоуровневая оболочка для Win32 API, поэтому обычно вы можете посмотреть в документации Windows на имя функции и получить необходимую информацию. Вы можете найти документацию для GetLogicalDrives здесь.

Чтобы ответить на ваш вопрос:

  1. Целое число соответствует доступным дискам: каждый доступный диск получает 1 бит. Так что если нет доступных дисков, вы получите 0, предполагая 32-разрядное целое число) назад. Если бы каждый диск был доступен, вы бы получили 0b11111111111111111111111111 (в двоичном формате)

  2. Здесь 26 букв, поэтому он перебирает 26 цифр. На самом деле код, который вы разместили, имеет цикл только от 1 до 25, и я думаю, что это ошибка. Это должно быть просто range(26) ,

  3. Побитовый и должен проверять отдельные биты возвращаемого целого числа. Помните, что каждый бит целого числа соответствует букве диска. Скажем, например, что ваши диски C, D и G доступны. Вы можете визуализировать возвращаемое значение следующим образом, где первая строка - это потенциальные диски, а вторая строка - возвращаемое значение в двоичном виде:

    ZYXWVUTSRQPONMLKJIHGFEDCBA # drive the bit corresponds to
    00000000000000000001001100 # returned value, in binary, if C, D, and G are available
    

Чтобы проверить, доступен ли диск A, необходимо проверить, что наименьший бит равен 1. Способ проверки отдельных битов - с помощью побитового и. Для проверки наименьшего бита, вы должны сделать drivebits & 1 Чтобы проверить диск B, необходимо проверить второй бит: drievebits & (1 << 1), Чтобы проверить C, вам нужен третий бит: drivebits & (1 << 2), И так далее.

Некоторый пример возвращает:

Если у вас есть только диск C, GetLogicalDrives вернется 0b100 (двоичный) или 4 (десятичный). Если бы C и D были доступны, вы бы получили 0b1100 (двоичный) или 12 (десятичный).

Другие вопросы по тегам