var
j: Integer;
begin
j := StrToInt(edt1.Text);
if (j > 1) and ((j and (j - 1)) = 0) then
ShowMessage('是2的次方数');
1. (j and (j - 1))
这部份条件里的and是进行位与运算
这里假设j符合条件(4)
0100 = 4 (j)
0011 = 3 (j-1)
----AND
0000 = 0
*符合条件的整数(1和0除外)经过这样运算结果为0
((j and (j - 1)) = 0)就比较好理解了
2. (j > 1)
理解了(1),这里就比较好理解.
今天又想在数据字典里多增加一项新的功能,想想又要去增加字段,麻烦!翻了一下资料。决定让规范TAG,让TAG可以表示更多的含义
*前题TAG_STR里的数字只允行为2的次方
1.增加TAG的编制栏位[TAG_STR],为字符串,可以生成TAG
2.[TAG_STR]栏可以输入1 or 2 or 4 or 8 or 16 or 32 ...
只允许有数字和'or' 然后生成TAG, 数字只允行为2的次方
3.程序里可以进行检测
const
FTAG_SYSTEM = 2
FTAG_APPR = 4
--------------
if (FTAG_SYSTEM AND TAG) <> 0 then 说明FTAG_SYSTEM在TAG里
if ((FTAG_SYSTEM AND TAG) <> 0) and ((FTAG_APPR AND TAG) <> 0) then 说明FTAG_SYSTEM和FTAG_APPR都在TAG里
if (((FTAG_SYSTEM OR FTAG_APPR) AND TAG) <> 0) then 说明FTAG_SYSTEM和FTAG_APPR都在TAG里
总结
其实就是利用数字的位运算来进行检测
0000001 --1
0000010 --2
0000100 --4
0001000 --8
... ... ...