关于0xFFFFFFFF和alpha,温故而知新
做圖像處理都好多年了,今天隨手做個小畫板的時候,發現一個挺有趣的小坑。而其實這個小坑,以前也坑過自己,不過太久沒處理了,又踩到坑里了。
?
先來看看:0xFFFFFFFF>>24
?
這個結果是什么呢?是不是妥妥的,0x000000FF?也就是要拿到的alpha?
?
實際不然,而且這個也并不是什么bug,或者編譯器的漏洞。實際上,這個結果是0xFFFFFFFF,console.log/trace出來,就是一個-1。
糾結吧?怎么就變了負數?
上次中坑,沒理解清楚,簡單理解是編譯器變量高位溢出了。因為在C++中做這個操作,是沒問題的,當時就沒有太多注意這個問題。結果用了一個旁門左道去解決:0xFFFFFFFF/2>>23
?
現在回頭想想,都覺得可笑,這樣的小把戲太幼稚,too naive!
今天又遇到了這個問題,而且大腦斷片了,很久都沒想起來原來已經中過坑,不過也好,倒是認真的深究了一下這個小問題。
其實,還是怪自己把計算機原理忘掉了,這就是平時工作眼高手低的結果。
因為flash和js中,0xFFFFFFFF其實是一個uint,用補碼表示,都是1,而右移位操作中,會按照原來最高位進行補位,例如原來是0就補0,原來是1就補1。
這樣就好理解了,uint存儲0xFFFFFFFF,那么最高位就是1,所以,無論怎么移位,還是全1,打印出來,當然就是-1。
?
那么,回到紙面上來,回到上層語言中,怎么做這個呢?小把戲就一邊玩兒去吧。
逼格高點,應該是:
(0xFFFFFFFF>>24)&0x000000FF
?
當然,這里0xFFFFFFFF實際上是一個變量。
轉載于:https://www.cnblogs.com/kenkofox/p/4540045.html
總結
以上是生活随笔為你收集整理的关于0xFFFFFFFF和alpha,温故而知新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二次冲刺 站立会议5
- 下一篇: android中活动的启动模式