zoukankan      html  css  js  c++  java
  • 关于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实际上是一个变量。

  • 相关阅读:
    这一年来
    网络流复习笔记
    Codeforces Round #431
    Codeforces Round #398 (Div. 2)
    Codeforces Round #418 (Div. 2)
    【Codeforces 98E】 Help Shrek and Donkey 游戏策略神题
    【bzoj1878】[SDOI2009]HH的项链
    Round 403 div. 2
    Codeforces Round #417 (Div. 2)
    Codeforces Round #416 (Div. 2)
  • 原文地址:https://www.cnblogs.com/kenkofox/p/4540045.html
Copyright © 2011-2022 走看看