在as3中,很少時候能看到**中含有移位操作,可能大多數人最常見的移位操作,也就是用來提取顏色通道的那幾行**:
var color:uint = 0x0ff0f0f0;
var a:uint = (color & 0xff000000) >> 24;
var red:uint = (color & 0x00ff0000) >> 16;
var green:uint =(color & 0x0000ff00) >> 8;
var blue:uint = (color & 0x000000ff);
位操作有其自身的優點和缺點,優點是運算速度快,占用空間小,缺點是**很難閱讀,開發成本高。可能很多人還是喜歡物件導向這種高階語言,因為在編寫程式本身的同時,我們就能說明自己的意圖。但是無論是出於優化的考慮還是為了同專案中的那些geek協作上的方便,我們還是需要掌握位操作的本質及常見的用法:
說到本質,估計大部分人還是知道一點的,但未必細緻入微。
我們都知道計算機的資料是以位元組為單位的,每個位元組有8個位,每個位有兩種狀態0或者1,移位操作顧名思義是將這些位進行整體移動,這一點直觀上非常容易理解,不用多說。但一旦涉及到實際問題,我們可能就會犯迷糊,比如1>>3的結果是多少。從本質上分析1這個資料在記憶體中向右移動三個位後最後一位的資訊將消失,剩下來的都是0,因此結果毫無疑問是0。所以那些想要通過右移來達到除法目的的人來說就要小心了。
偶數倍數運算:我們知道對二進位制資料1,將其向左移動1位結果為10(2),左移2為結果為100(4),因此左移n位的結果就是原值的2n倍。當然你反過來右移,就是原結果的1/2n,但這是在有效資料沒有沒移出界的前提下才成立的。同樣左移操作成立的條件是別把最高位移出界限。
階梯運算:類似於math.floor或math.ceil方法。如a>>3運算可以將在0-7之間的資料都擷取為0,8-17之間的資料擷取為1。這一運算常被運用在bytearray的位操作中。
最後來注意乙個細節
如果將上面的顏色值改為0xf0f0f0f0,那麼a輸出結果會是什麼?很不幸的是結果並不是0xf0,而是0xfffffff0,如果你直接執行下面的運算:
trace((0xf0f0f0f0 & 0xff000000) >> 24)
會發現結果為負值。
之所以會這樣,是因為》是有符號的位運算,即它每次移位都會保留符號位如果符號位為1,這樣一路下來1撒了一路。既然有 「有符號的移位」,那麼必然有無符號的移位,這就是》。不過這個運算沒有對應的無符號左移運算子與之對應,符號只會在右移的時候對結果產生影響。
AS3中的數字運算問題
乙個看似簡單的問題,但是在實際工作的時候卻讓人很鬱悶。用as3做乙個很簡單的運算,如下 trace 82.125 17.43 輸出1431.43875 var key number 82.125 17.43 616 trace key 輸出2047.43875 a trace key 1 輸出204...
as3中的容器
4種容器 array object vector dictionary 各自特點 array是索引陣列,雖然它也是動態類,可以等同於object來用,但是不建議這樣,因為沒有任何好處。除了鍵上的區別外,array還是善於隨機訪問的,但不知道object和dictionary和它在訪問速度上的區別有多...
再學AS3(二) 乘法運算
知識點 1 想執行一些方法,然後返回結果給呼叫它的函式,可以使用return 語句返回結果,return 返回的資料型別必須與函式申明的返回型別相一致。2 如果第乙個數字輸入的是0或輸入了四個數字,則游標跳轉到第二個輸入文字框中,stage.focus 3 如果第乙個數字輸入的是0或輸入了四個數字,...