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,结果非常奇怪。如果我将整数转换为二进制字符串表示形式并且通过字符进行迭代,则结果是正确的,但我假设我不应该使用字符串来进行此操作。任何帮助或示例将不胜感激。谢谢。
您通常使用以下命令检查整数变量中是否设置了特定位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)