Python GetLogicalDrives按位AND

时间:2015-11-18 21:28:05

标签: python 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时,它返回一个整数。有人解释原因吗?

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

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

谢谢

1 个答案:

答案 0 :(得分:1)

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

回答你的问题:

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

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

  3. 按位并且是检查返回的整数的各个位。请记住,整数的每个对应一个驱动器号。例如,假设您的C,D和G驱动器可用。您可以像这样可视化返回的值,其中第一行是 potential 驱动器,第二行是返回的二进制值

    ZYXWVUTSRQPONMLKJIHGFEDCBA # drive the bit corresponds to
    00000000000000000001001100 # returned value, in binary, if C, D, and G are available
    
  4. 要检查驱动器A是否可用,您需要检查最小位是否为1. 检查各个位的方法是按位和。要检查最小位,你会做drivebits & 1,检查驱动器B,你需要检查第二位:drievebits & (1 << 1)。要检查C,您需要第三位:drivebits & (1 << 2)。等等。

    一些示例返回:

    如果您只有驱动器C可用,GetLogicalDrives将返回0b100(二进制)或4(十进制)。如果C和D可用,您将获得0b1100(二进制)或12(十进制)。

相关问题