我想判断电脑里有多少个驱动器,找到了GetLogicalDrives函数。下面是万一老师博客里面的一段代码procedure TForm1.FormCreate(Sender: TObject);
var
  Drives: DWord;
  i: Integer;
begin
  Drives := GetLogicalDrives;  Memo1.Clear;
  for i := 0 to 25 do {最多 26 个字母都用上}
    if LongBool(Drives and ($0001 shl i)) = True then
      Memo1.Lines.Add(Char(Ord('A')+i) + ':\');
end;但是我看不懂,特别是if LongBool(Drives and ($0001 shl i)) = True then是什么意思???另外我想判断GetLogicalDrives返回值的每个位具体为1 还是0,该怎么判断呢?如果是使用shr来操作,那么怎么才能判断最后一位是1 还是0?谢谢!

解决方案 »

  1.   

    16进制的0001左移i位,相当于乘以2的i次方,你把它转换成二进制再看就很清楚了
    返回值:返回值的二进制右边第一位为 1 表示驱动器 A: 存在;返回值的二进制右边第二位为 1 表示驱动器 B: 存在...以次类推
      

  2.   

    而在布尔计算当中,0为假,1为真。这个运算结果你应该很清楚吧
    true   and   true=true   (1   and   1=1)   
    true   and   false=false(1   and   0=1)    
      

  3.   

    if LongBool(Drives and ($0001 shl i)) = True then举个例子,如果drives的值为:0000 0000 0000 0000 0000 0000 0001 1101;那么($0001 shl i)在i=0的时候值为:0000 0000 0000 0001;
    如果($0001 shl i)在i=1时的值为:0000 0000 0000 0001 0000
    不管怎么说,(drives and ($0001 shl i))总是为真啊,因为两个比较项都是大于1;
    糊涂了
      

  4.   

    LongBool(Drives and ($0001 shl i))
    这里的 and 是按位与运算, and 运行后得到的值就剩下指定的位了。再转换成LongBool, 也就是非零就转换成True, 零就转换成了False.
    因此该条件语句,就是判断了Drives的第i位是否为零
      

  5.   

    呵呵,大概明白了,谢谢!另外drives返回的是一个32位的值,($0001 shl i)是一个16位的值,经过26次循环以后,将会变成26位的值,对吗?
      

  6.   

    ($0001 shl i)这个也是采用32位数的移位,不过如果你愿意把它看作26位的,也没问题,主要知道它移位没有超界就好了。