2015-11-18 9 views
3

У меня есть некоторые вопросы о следующем коде.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 действительно низкого уровень обертка API Win32, так что обычно вы можете посмотреть документацию Windows, имя функции и получить информацию вам нужно. Вы можете найти documentation for GetLogicalDrives here.

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

  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 
    

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

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

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

+0

Хорошо, спасибо большое. Но о побитом И я имею в виду, что это код для проверки того, подключен ли какой-либо съемный диск, так зачем нам делать побитовое И? Допустим, я получил только диск C, поэтому я получил 0b100 в качестве своих дисков, почему я должен писать строку «if drivebits & mask:»? –

+0

@ M.Han: Я обновил свой ответ. Теперь он должен иметь больше смысла. –

+0

Я полностью понял. Большое спасибо! –