用AS这么久了,还没有对As中的操作符进行系统的研究。
与http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/operators.html#array_access,
对每一个操作符进行仔细的研究以备参考。
研究中也会把as3语言和其他语言(javascript 和C)对比,加深理解。
一:Arithemetic
略(基本的 + , ++ , -, --, * , / , %)
二:Arithemetic compound assignmet
略 (不能再熟的 += , -= , *= , /= , %= )
三:assignment
略 (=)
四:Bitwise
对于位运算,都是对数字的补码进行逐位操作的。
1. & (Bitwise And)
基本的规则为: 0&0 =0 0&1=0 1&0=0 1&1=1
比如n为任意整数则有
n & -1 = n;
2. | (BItwise Or)
基本的规则为:0 | 0=0 , 0 | 1=1 , 1 | 0 = 1, 1 | 1 = 1
比如AS3代码:
var n1:int = int.MAX_VALUE ;
var n2:int = -1;
var n3:int = n1 | n2;
trace( n3 ); // -1
3.~ (Btwise Not)
基本的规则为: ~0=1 , ~1=0
对整数取反可以形象地表示成在数轴上取对称数字。
例如下面的C语言
int n1 = INT_MAX;
int n2 = ~n1;
printf("%d", n2);
4.^(Bitwise XOR)
基本的规则为:0^0=1, 1^0=1, 0^1=1, 1^1=0
5. << (Bitwise Left Shift) >>(Bitwise Right Shift)
n<<m 得到整数n的补码后,将所有位向左移动m位,右边补0,左边抛掉。
n>>m 得到整数n的补码后, 将所有位向右移动m位,右边抛掉,左边补符号位。
比如:
// 0111 1111 1111 1111 1111 1111 1111 1111
int n1 = INT_MAX;
// 1111 1111 1111 1111 1111 1111 1111 1110
int n2 = n1<<1;
// 0001 1111 1111 1111 1111 1111 1111 1111
int n3 = n1>>2;
// 1111 1111 1111 1111 1111 1111 1111 1111
int n5 = -1;
// 1111 1111 1111 1111 1111 1111 1111 1111
int n6 = n5>>2;
// -2
printf("left shift %d", n2);
// 536870911
printf("\npositive right shift %d", n3);
//-1
printf("\nnegative right shift %d ", n6 );
6.>>>(Bitwise unsigned right shift)
同>>几乎相同,不同的是左边补足的不是符号位,而始终是0。
例如AS3代码:
// 0111 1111 1111 1111 1111 1111 1111 1111
var n1:int = int.MAX_VALUE;
// 0001 1111 1111 1111 1111 1111 1111 1111
var n3:int = n1>>>2;
// 1111 1111 1111 1111 1111 1111 1111 1111
var n5:int = -1;
// 0011 1111 1111 1111 1111 1111 1111 1111
var n6:int = n5>>>2;
// 536870911
trace("\npositive right shift"+ n3);
//1073741823
trace("\nnegative right shift "+ n6 );
值得注意的是>>>在C语言里并没有,但是与AS3同内核的javascript是存在的。例如下面的JS代码:
// 0111 1111 1111 1111 1111 1111 1111 1111
var n1= 2147483647;
// 0001 1111 1111 1111 1111 1111 1111 1111
var n3= n1>>>2;
// 1111 1111 1111 1111 1111 1111 1111 1111
var n5= -1;
// 0011 1111 1111 1111 1111 1111 1111 1111
var n6= n5>>>2;
// 536870911
//1073741823
alert("\npositive right shift "+ n3
+"\nnegative right shift "+n6
);