当前位置 : 主页 > 网页制作 > xml >

XML中的位操作Delphi – 按位

来源:互联网 收集:自由互联 发布时间:2021-06-13
我是高中生,目前正在学习Delphi XE3.我们正在学习BIT操作.我们有一个作业,虽然我已经阅读了很多关于这个主题并理解在Bits和SHL / SHR中存储信息的整个过程,但是我很难理解如何在Delphi中完
我是高中生,目前正在学习Delphi XE3.我们正在学习BIT操作.我们有一个作业,虽然我已经阅读了很多关于这个主题并理解在Bits和SHL / SHR中存储信息的整个过程,但是我很难理解如何在Delphi中完成这个过程.

作业如下:

Decimal        Hexidecimal    Binary
1              0x0001         0000000000000001
2              0x0002         0000000000000010
4              0x0004         0000000000000100

传递XML文件中的整数值以标识选项集.例如.如果我想发送选项1和选项2,我会添加1 2 = 3.我会发送3作为数字来指定选项1和2为真.

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

根据我的阅读,我需要使用面具,但我不明白该怎么做.我如何在Delphi中使用蒙版获取单个值为True或False.

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

您通常使用和二元运算符检查是否在Integer变量中设置了特定位,并使用或运算符设置各个位,如下所示:

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;

不同的OPTION_常量实际上是masks,在某种意义上它们用于将位屏蔽为零(以检查特定位是否已设置)或将位屏蔽为1(以设置特定位).

考虑这个片段:

begin
  ..

  if cbOptionX.Checked then
    Options := Options or OPTION_X;
  ..

或者将第一位屏蔽为1.如果我们以01010000的Options值(二进制)开始,结果选项将为01010001

01010000   
 OR 00000001  //OPTION_X 
  = 01010001

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

>首先它将Option变量的所有非感兴趣字节MASK为0.如果我们考虑01010001的最后一个值,操作将导致清除所有位,但第一个.

01010001   
AND 00000001   
  = 00000001

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

01010000   
    AND 00000001   
      = 00000000

>接下来,它会比较该值是否等于掩码本身.如果它相等,则在原始Options变量中设置该位,否则未设置该位.如果你的掩码只包含一个位,那就是味道问题,你可以检查结果值是否不是0,但是如果你的掩码包含多个位并且你想检查是否所有的位都被设置了,那么你必须检查是否平等.

网友评论