XML中的位操作Delphi-按位

LHe*_*arn 5 delphi bit-manipulation delphi-xe2

我是一名高中生,目前正在Delphi XE3中学习。我们正在学习BIT操纵。我们有一个作业,虽然我已经阅读了很多有关该主题的文章,并且了解了在Bits和SHL / SHR中存储信息的整个过程,但是我很难理解如何在Delphi中进行此过程。

分配如下:

Decimal        Hexidecimal    Binary
1              0x0001         0000000000000001
2              0x0002         0000000000000010
4              0x0004         0000000000000100
Run Code Online (Sandbox Code Playgroud)

在XML文件中传递整数值以标识选项集。例如。如果我想发送选项1和选项2,我将添加1 + 2 = 3。我将发送3作为数字,以指定选项1和2为true。

在客户端上,二进制值将为0000000000000011 = 3

从我已阅读的内容中,我需要使用口罩,但我不知道该怎么做。我将如何在Delphi中使用遮罩来获得单个值,即True或False。

我尝试在常规Integer变量中执行此操作,但始终将其视为Integer,结果非常奇怪。如果我将整数转换为二进制字符串表示形式并且通过字符进行迭代,则结果是正确的,但我假设我不应该使用字符串来进行此操作。任何帮助或示例将不胜感激。谢谢。

jac*_*ate 3

您通常使用以下命令检查整数变量中是否设置了特定位and,并使用该运算符设置各个位or,如下所示:

const
  OPTION_X = $01;
  OPTION_Y = $02;
  OPTION_Z = $04;

var
  Options: Byte;
begin
  Options := OPTION_X or OPTION_Y;  //actually 3, like in your example
  //check if option_X is set
  if (Options and OPTION_X) = OPTION_X then
    ShowMessage('Option X is set');  //this message is shown, because the bit is set
  //check if option_Z is set
  if (Options and OPTION_Z) = OPTION_Z then
    ShowMessage('Option Z is set');  //this message is NOT shown
end;
Run Code Online (Sandbox Code Playgroud)

不同的OPTION_常量实际上是mask,从某种意义上说,它们用于将位掩码为零(以检查是否设置了特定位)或将​​位掩码为1(以设置特定位)。

考虑这个片段:

begin
  ..

  if cbOptionX.Checked then
    Options := Options or OPTION_X;
  ..
Run Code Online (Sandbox Code Playgroud)

or第一位屏蔽为 1。如果我们以 01010000 的选项值(二进制)开始,则生成的选项将为 01010001

    01010000   
 OR 00000001  //OPTION_X 
  = 01010001   
Run Code Online (Sandbox Code Playgroud)

相同的值用于将所有其他位屏蔽为 0,以检查是否设置了特定位。这 if例如,条件:(Options and OPTION_Z) = OPTION_Z执行以下操作:

  • 首先,它将 Option 变量的所有不感兴趣的字节屏蔽为 0。如果我们考虑最后一个值 01010001,该操作将导致清除所有位,但第一个位除外。

        01010001   
    AND 00000001   
      = 00000001   
    
    Run Code Online (Sandbox Code Playgroud)

考虑起始值为 01010000 它将返回零:

        01010000   
    AND 00000001   
      = 00000000   
Run Code Online (Sandbox Code Playgroud)
  • 接下来,它比较该值是否等于掩码本身。如果相等,则在原始选项变量中设置该位,否则未设置。如果您的掩码仅包含一位,那就是口味问题,您可以只检查结果值是否不同于 0,但如果您的掩码包含多个位并且您想检查是否设置了所有位,则您可以必须检查是否相等。