请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 4857|回复: 4

[服务器端交互] 二进制在FLASH中的应用 [复制链接]

lzyy 楼主

无网不剩

荣誉管理 手机认证 

帖子
1781
体力
7608
威望
65
发表于 2007-5-5 14:08:04 |显示全部楼层
一说到二进制,我们总是或多或少的感觉没有底,因为接触的比较少,而且也不是那么直观,容易理解,这次就来谈谈在FLASH中使用二进制,老少皆宜哦。

首先来看一段程序
  1. var round:Number = 2;
  2. var sweet:Number = 4;
  3. var delicious:Number = 8;
  4. var blet:Number = 16;

  5. //苹果是甜的、圆的、好吃的
  6. var apple:Number = round | sweet | delicious;

  7. //下面我们来看看苹果是不是好吃的
  8. if(apple & delicious){
  9.         trace("apple is delicious");
  10. }
  11. //再来看看苹果是不是圆的
  12. if(apple & round){
  13.         trace("apple is round");
  14. }

  15. //再来看看苹果有没有腐烂
  16. //这里不会输出,因为我们先前定义的苹果并没有腐烂
  17. if(apple & blet){
  18.         trace("apple is blet");
  19. }

  20. //假设我们的苹果腐烂了,那我们将加上腐烂这个属性,同时去掉美味这个属性
  21. apple |= blet;
  22. apple = apple & ~delicious;
  23. //我们再来看看上面的输出
  24. //第二个输出将不会显示
  25. if(apple & blet){
  26.         trace("apple is blet");
  27. }
  28. if(apple & delicious){
  29.         trace("apple is delicious");
  30. }
复制代码


下面我们来分析一下上面的代码
我首先定义了4个属性,应该注意到了这四个属性的值分别是2的N次方,其实换成2进制就是10,100,1000,10000
接着又定义了一个apple变量,用到了"|"符号(按位 OR 运算符),官方的解释是:
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次方到底等于多少,所以,可以采用下面的方法
  1. var shifts:Number = 0;

  2. var ONE         = 1 << shifts++; // 1
  3. var TWO         = 1 << shifts++; // 2
  4. var THREE         = 1 << shifts++; // 4
  5. var FOUR         = 1 << shifts++; // 8
复制代码

"<<"(按位向左移位运算符),比如"2 << 2"的结果就是8,就是将2的2进制"10"向左移两位,也就是"1000",转换成10进制就是8
已有 1 人评分威望 收起 理由
jimohuoshan + 2 高级话题

总评分: 威望 + 2   查看全部评分

西部数码顶级域名注册商39元抢注!

灰昼

金牌会员

帖子
1182
体力
3360
威望
7
发表于 2007-5-5 14:44:15 |显示全部楼层
很有意思的文章

楼主该写书了

租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

nang 

终极讨厌

金牌会员

帖子
1614
体力
3138
威望
8
发表于 2007-5-5 15:25:24 |显示全部楼层
呵呵,打倒出来慢慢看
终极讨厌    我的博客

使用道具 举报

寂寞火山

荣誉管理 手机认证 

帖子
2584
体力
10205
威望
197
发表于 2007-5-5 21:57:46 |显示全部楼层
二进制和位运算是编程中比较高级的写法,用的好了可以大大的提高程序执行效率。
楼主比我强,我在进行这部分的学习时没有楼主这么用心研究。
《AS权威指南》第382页开始有十几页关于位逻辑编程的说明,比楼主的要深刻一些,建议对这个帖子感兴趣的朋友去查阅一下。但不管怎么说,楼主的研究精神还是很可贵的,打分鼓励一下

使用道具 举报

HBrO 
帖子
7398
体力
32121
威望
241
居住地
广东省 广州市
发表于 2007-5-6 21:14:25 |显示全部楼层
哦~这些运算确实比四则运算要效率高的,如果从C等语言的角度来说,AS的我反而不是很清楚

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 12:48 , Processed in 0.132986 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部