原文地址: http://blog.chinaunix.net/uid-26750235-id-3147561.html
位运算符( << >> & ^ | )
(bitwise operator)
(一)位运算符
位运算符属于二元运算符,有这么5种:<< >> & ^ | 。他们之间的优先级关系为:
运算符
优先级
<< >>
高
&
^
|
低
在redy中每一个位运算符在抽象语法树中,都会用一个结点来表示:
结点AstNodeLShift表示运算符 << 结点AstNodeRShift表示运算符 >> 结点AstNodeBitAnd表示运算符 & 结点AstNodeBitXor表示运算符 ^ 结点AstNodeBitOr表示运算符 |
这5个结点都继承AstNodeBinaryExpr,用uml表示为:
图1
(二)实例
下面来看两个位运算符表达式相应的语法树
表达式:1>>3|5<<2&1+2^7
图2
表达式:~8<<4|7*5>>8+2
图3
(三)执行方法:
AstNodeLShift的执行方法为:
代码3.1
AstNodeLShift.execute() AstNodeLShift.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeLShift.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.lshift(right_value) /*调用方法lshift*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
AstNodeRShift的执行方法为:
代码3.2
AstNodeRShift.execute() AstNodeRShift.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeRShift.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.rshift(right_value) /*调用方法rshift*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
AstNodeBitAnd的执行方法为:
代码3.3
AstNodeBitAnd.execute() AstNodeBitAnd.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeBitAnd.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.bit_and(right_value) /*调用方法bit_and*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
AstNodeBitXor的执行方法为:
代码3.4
AstNodeBitXor.execute() AstNodeBitXor.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeBitXor.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.bit_xor(right_value) /*调用方法bit_xor*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
AstNodeBitOr的执行方法为:
代码3.5
AstNodeBitOr.execute() AstNodeBitOr.b_left.execute() /*执行左结点*/ left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/ AstNodeBitOr.b_right.execute() /*执行右结点*/ right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/ ret_value=left_value.bit_or(right_value) /*调用方法bit_or*/ reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end
返回文档首页
附: 代码下载: git clone git://git.code.sf.net/p/redy/code redy-code
AstNodeLShift AstNodeRShift AstNodeBitAnd AstNodeBitXor AstNodeBitOr 位于src/syntax/ 文件ast_node_binary_expr中
