首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

hiphop 原理分析三(2)原创-胡志广

2013-08-04 
hiphop 原理分析3(2)原创--胡志广?在hiphop中许多的处理是通过设置枚举,然后通过位运算来判断类型的,比如

hiphop 原理分析3(2)原创--胡志广

?

在hiphop中许多的处理是通过设置枚举,然后通过位运算来判断类型的,比如这个varibable的attribute或者如修饰符(public,protected,private)等;

l??设置值一般通过按位或进行设置;

l??清空值是(本值&~需删除的值)

l??比较是按位与

?

设置变量属性原理:

?Attribute?的枚举为:

? 1

? 11

? 100

?1000

?10000

?100000

?1000000

?10000000

?100000000

?......

?10000000000

?

VariableTable(variable_table.h)

enum Attribute {

??? ContainsDynamicVariable = 1,

???????? //11

??? ContainsLDynamicVariable =ContainsDynamicVariable | 2,

??? //100

??? ContainsExtract = 4,

??? //1000

??? ContainsCompact = 8,

??? //10000

??? InsideStaticStatement = 16,

??? //100000

??? InsideGlobalStatement = 32,

??? //1000000

??? ForceGlobal = 64,

??? //10000000

??? ContainsUnset = 128,

??? //10000000

??? NeedGlobalPointer = 256,

??? //100000000

??? ContainsDynamicStatic? = 512,

??? //1000000000

??? ContainsGetDefinedVars = 1024,

??? //10000000000

??? ContainsDynamicFunctionCall = 2048,

? };

?

当做set操作时,原理如下:如前6个进行set操作(|或)操作

??那么值为:111111

??如果只做6个set ,其中第3个(100)没有set操作,那么按位或后的值为:111011

??操作步骤如下:

?1|11=11,11|1000=1011,1011|10000=11011,11011|100000=111011

??这个是set(或)操作,也就是,如果哪个没有设置进去,该位的数应该为0,比如100没有

? set,那么在第3位就是0(111011),以此原理类推;

?

??清空所在元素原理:

??比如现在有6个元素进行了按位与后值为(111111),那么我们要清空1000,那么执行的操作是clear

??也就是m_attribute=m_attribute&~attr;

??那么执行操作:m_attribute=111111&~(1000)=>111111&110111=110111

??这样按位与后,第4位变为了0,那么说明1000已经被清空了,取反过程是以最长数为准

? (如1000是4位,需要按111111的位数取反,最终成为110111)

?

比较:

? get

??如现在的m_attribute是110111

??那么我们现在要查2个结果是否在m_attribute中,一个是1000,另一个是100

??首先查1000?,算法是按位与:m_attribute=m_attribute&attr;m_attribute=110111&1000=>110111&001000=>0,所以不存在

??然后查100,算法是按位与:m_attribute=m_attribute&attr;m_attribute=110111&100=>110111&000100=>000100=>100

??所以返回的是100本身,这样说明其存在,对比成功

??然后其他类似context等这样类似的功能,算法都是一样的

?

?

下一节:hiphop 原理分析4

热点排行