一说到二进制,我们总是或多或少的感觉没有底,因为接触的比较少,而且也不是那么直观,容易理解,这次就来谈谈在FLASH中使用二进制,老少皆宜哦。
首先来看一段程序var round:Number = 2;
var sweet:Number = 4;
var delicious:Number = 8;
var blet:Number = 16;
//苹果是甜的、圆的、好吃的
var apple:Number = round | sweet | delicious;
//下面我们来看看苹果是不是好吃的
if(apple & delicious){
trace("apple is delicious");
}
//再来看看苹果是不是圆的
if(apple & round){
trace("apple is round");
}
//再来看看苹果有没有腐烂
//这里不会输出,因为我们先前定义的苹果并没有腐烂
if(apple & blet){
trace("apple is blet");
}
//假设我们的苹果腐烂了,那我们将加上腐烂这个属性,同时去掉美味这个属性
apple |= blet;
apple = apple & ~delicious;
//我们再来看看上面的输出
//第二个输出将不会显示
if(apple & blet){
trace("apple is blet");
}
if(apple & delicious){
trace("apple is delicious");
}
expression1 | expression2
将 expression1 和 expression2 转换为无符号的 32 位整数,然后对于 expression1 或 expression2 的为 1 的对应位的每一位返回 1。浮点数通过舍去小数点后面的所有位来转换为整数。结果是一个新的 32 位整数。
如果觉得不太能理解,那就以上面的例子为例。"10 | 100" 的结果是110,"110 | 1000"的结果是1110。所以apple的值其实就是二进制的1110,转换成10进制就是14
然后又出现了一个"&"符号(按位 AND 运算符),官方解释:expression1 & expression2
将 expression1 和 expression2 转换为 32 位无符号整数,并对整数参数的每一位执行布尔 AND 运算。浮点数通过舍去小数点后面的所有位来转换为整数。结果是一个新的 32 位整数。
说白了,就是expression1和expression2的相同位数上必须都是1,那么在结果的对应位置上才是1,所以"apple & delicious"的运算过程就是"1110 & 1000"等于1000,所以判断成立
在加上了blet属性后,我们去掉delicious属性,这是通过"&"和"~"共同完成的,这里又出现了一个"~"(按位 NOT 运算符),就是一个取反运算,原来是0的变1,原来是1的变0,所以"apple & ~delicious"的运算过程是:首先对delicious取反,delicious原来是1000,取反之后自然变成了0111,再与apple执行&运算,"11110 & 0111",结果是10110,相当于去掉了delicious属性
二进制的一个比较典型的用法,就是可以用来保存多个属性,同时可以对这些属性进行基本的运算,这个在上面的代码中已经体现出来了。
补注:
其实,上面这种属性的声明方法并不是很明智,因为一旦属性比较多的话,还得去计算2的N次方到底等于多少,所以,可以采用下面的方法。var shifts:Number = 0;
var ONE = 1 << shifts++; // 1
var TWO = 1 << shifts++; // 2
var THREE = 1 << shifts++; // 4
var FOUR = 1 << shifts++; // 8
"<<"(按位向左移位运算符),比如"2 << 2"的结果就是8,就是将2的2进制"10"向左移两位,也就是"1000",转换成10进制就是8。
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!