Chinaunix首页 | 论坛 | 博客
  • 博客访问: 326200
  • 博文数量: 32
  • 博客积分: 424
  • 博客等级: 准尉
  • 技术积分: 465
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-02 10:23
文章分类

全部博文(32)

文章存档

2012年(32)

分类: Python/Ruby

2012-03-25 15:45:31

返回文档首页 

位运算符( << >> & ^ | )

(bitwise operator)

()位运算符

位运算符属于二元运算符,有这么5种:<< >> & ^ | 。他们之间的优先级关系为:


运算符

优先级

<< >>

&


^


|


redy中每一个位运算符在抽象语法树中,都会用一个结点来表示:

    1. 结点AstNodeLShift表示运算符 <<
    2. 结点AstNodeRShift表示运算符 >>
    3. 结点AstNodeBitAnd表示运算符 &
    4. 结点AstNodeBitXor表示运算符 ^
    5. 结点AstNodeBitOr表示运算符 |


5个结点都继承AstNodeBinaryExpr,用uml表示为:

1

()实例

下面来看两个位运算符表达式相应的语法树

表达式:1>>3|5<<2&1+2^7

2

表达式:~8<<4|7*5>>8+2

3


()执行方法:

AstNodeLShift的执行方法为:

代码3.1

  1. AstNodeLShift.execute()
  2.     AstNodeLShift.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeLShift.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.lshift(right_value) /*调用方法lshift*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. end

AstNodeRShift的执行方法为:

代码3.2

  1. AstNodeRShift.execute()
  2.     AstNodeRShift.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeRShift.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.rshift(right_value) /*调用方法rshift*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. end

AstNodeBitAnd的执行方法为:

代码3.3

  1. AstNodeBitAnd.execute()
  2.     AstNodeBitAnd.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeBitAnd.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.bit_and(right_value) /*调用方法bit_and*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. end

AstNodeBitXor的执行方法为:

代码3.4

  1. AstNodeBitXor.execute()
  2.     AstNodeBitXor.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeBitXor.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.bit_xor(right_value) /*调用方法bit_xor*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. end

AstNodeBitOr的执行方法为:

代码3.5

  1. AstNodeBitOr.execute()
  2.     AstNodeBitOr.b_left.execute() /*执行左结点*/
  3.     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/
  4.     AstNodeBitOr.b_right.execute() /*执行右结点*/
  5.     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/
  6.     ret_value=left_value.bit_or(right_value) /*调用方法bit_or*/
  7.     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/
  8. end


返回文档首页 

附:  代码下载: git clone git://git.code.sf.net/p/redy/code redy-code

AstNodeLShift  AstNodeRShift  AstNodeBitAnd AstNodeBitXor AstNodeBitOr  位于src/syntax/  文件ast_node_binary_expr中

阅读(5316) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

最大行业软件2012-12-01 10:39:15

PTC Creo Elements/Pro 5.0 M070 Working for Win32-ISO 1DVD(最新多语言正式版包括简、繁体中文)

PTC Creo Elements/Pro 5.0 M070 Working for Win64-ISO 1DVD

PTC Creo Elements View (ex Product View) v10 F000 build 93 Pro Multilanguage Win32 1CD

PTC Creo Elements View (ex Product View) v10 F000 build 93 Pro Multilanguage Win64 1CD

 

PTC Pro/E WildFire+Pro/Mechancia 4.0 M110 Working for Win32-ISO 1DVD(最新多语言正式版包括简、繁体中文)

PTC Pro/E Wil