Python GetLogicalDrives 按位与

Python GetLogicalDrives Bitwise AND

我对以下代码有一些疑问。

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-当您使用 win32 模块中的 GetLogicalDrives 时,它 returns integer.Can 有人解释为什么?

2-为什么循环的范围在1到26之间?

3-按位与的原因是什么?

谢谢

win32 模块是 Win32 API 的一个非常低级的包装器,因此通常您可以查看函数名称的 Windows 文档并获取您需要的信息需要。您可以找到 documentation for GetLogicalDrives here.

回答你的问题:

  1. 整数对应可用驱动器:每个可用驱动器获得1位。因此,如果没有可用的驱动器,您将返回 0,假设为 32 位整数)。如果每个驱动器都可用,您将得到 0b11111111111111111111111111(二进制)

  2. 有26个字母,所以循环26个数字。 实际上,您发布的代码只是从 1 循环到 25,我认为这是一个错误。它应该只是 range(26).

  3. 按位与是检查returned整数的各个位。请记住,整数的每个对应一个盘符。例如,假设您的 C、D 和 G 驱动器可用。您可以像这样想象 returned 值,其中第一行是 potential 驱动器,第二行是 returned二进制值:

    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)。等等。

一些例子returns:

如果您只有 C 盘可用,GetLogicalDrives 将 return 0b100(二进制)或 4(十进制)。如果 C 和 D 可用,您将得到 0b1100(二进制)或 12(十进制)。