整数标志如何工作?

时间:2014-03-16 17:47:07

标签: delphi flags

我不明白标志是如何工作的,并且会感谢一些帮助以及指向教程的链接,以尝试理解将Integer中的值作为标志添加时发生的事情。

例如,我正在将各种大小的文件备份到SD卡。许多文件通常已经存在,因此我首先检查FileExistsFileAge和大小,然后将其添加到列表中以复制ShFileOperation。使用彼得·巴洛(Peter Barlow)的例行程序,这是有效的,但我想压制一些东西。

如果文件大于10M,那么我想显示win-progress栏,我不想提示覆盖现有文件。另外,我不希望它检查是否有足够的空间,因为我已经做了,所以我知道有足够的空间进行所有更新。

我曾尝试弄乱ANDOR以及+-,但似乎无法弄清楚我需要的组合。

if aBigFile then
  OpStruc.fFlags:=FOF_NOCONFIRMATION or FOF_SIMPLEPROGRESS else
  OpStruc.fFlags:=FOF_SILENT or FOF_NOCONFIRMATION;

有人可以举一个例子说明我需要做些什么工作吗?

1 个答案:

答案 0 :(得分:7)

Andor是按位运算符。这意味着它们可以独立地应用于每个操作数位。在了解按位运算时,有助于以二进制而不是十进制来描绘操作数。 (一旦你熟悉它们的工作原理,十进制仍然不是理想的格式;大多数人更喜欢十六进制,或者在较小程度上,更喜欢八进制。)

对于and,当且仅当两个操作数的位都置位时,才设置结果位;否则,结果被清除。对于or,如果设置了操作数位的一个,则设置结果。当两者都已设置时,它也会设置,因此它被称为包含或。 (还有独占或,其中只有在设置两个操作数中的一个时才设置结果.Delphi使用xor运算符。)

要计算大于一位的操作数的结果,这些位是并行计算的,因此结果的第一位是从操作数的第一位计算的,第二位是从第二位计算的,所以上。

组合标志时,使用or表示您要设置两个标志。例如:

// Indicate we want both a simple progress bar *and* a lack of confirmation.
OpStruc.fFlags := fof_NoConfirmation or fof_SimpleProgress;

二进制中的第一个标志值是00010000.第二个标志是000100000000。这使得结果为000100010000。

设置标志时,您不会经常使用and。相反,当您想要检查是否设置了标志时,通常会使用这种方法。例如:

// Check whether the no-confirmation flag is set:
var FlagSet: Boolean;
FlagSet := (OpStruc.FFlags and fof_NoConfirmation) = fof_NoConfirmation;

由于输入为000100010000,带有标志值的and的结果为000000010000.这等于标志值,因此FlagSet的值将为真。 / p>

足以检查and操作的结果是否为非零,而不是检查它是否与标志完全相等你正在测试。当标志由多个设置位组成时,您希望检查它们的所有是否存在。如果只有一个存在,and操作的结果仍然不为零。

删除标志,可以使用not反转要删除的标志位(清除所有设置位,反之亦然),然后使用{{1}清除这些位。例如:

and

OpStruc.FFlags := OpStruc.FFlags and not fof_SimpleProgress; 的倒数是111011111111.到目前为止,fof_SimpleProgress的值是000100010000。将FFlagsand组合将产生000000010000,等于fof_NoConfirmation,就像我们& #39; d期望删除fof_SimpleProgress

现在,您已了解各个标记值的组合方式,您已配备指示要传递给您遇到问题的特定API函数的标记。阅读每个标志的文档,并确定它是否是您想要使用的标志。如果是,请将其包含在标志列表中。

您可以按任意顺序将标记与or结合使用。如果您知道自己总是需要某些标志,并且有条件地想要其他标志,则可以从常用标志列表开始,然后再添加其他标志。例如:

OpStruc.FFlags := fof_NoConfirmation or fof_SimpleProgress;
if BigFiles then
  OpStruct.FFlags := OpStruc.FFlags or fof_Silent;

经常使用加法来组合标志。显然,fof_NoConfirmation or fof_SimpleProgress的结果等于fof_NoConfirmation + fof_SimpleProgress。但是,这仅在每个标志的位值不同时,以及多次不包含任何标志时才有效。 fof_Silent or fof_Silent的结果等于fof_Silent,而fof_Silent + fof_Silent的结果是fof_RenameOnCollision,这是一个完全不相关的标志。使用标记时始终使用andor,永远不要+-