我是高中生,目前正在学习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,但是如果你的掩码包含多个位并且你想检查是否所有的位都被设置了,那么你必须检查是否平等.