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