当前位置:C++技术网 > 资讯 > 请问以下这段代码代表什么意思

请问以下这段代码代表什么意思

更新时间:2018-01-16 10:01:47浏览次数:1+次

(unsigned int)((*raw_image)<<16 | (*raw_image)<<8 | (*raw_image) | 0xff000000);其中raw_image是 unsigned char *raw_image,那么(unsigned int)((*raw_image)<<16 | (*raw_image)<<8 | (*raw_image) | 0xff000000);应该怎么理解了呢,同时希望可以额外帮我解释下高位,低位,左移右移是怎么回事

C++技术网会员解答:

    感谢您对C++技术网的支持与信任。

    对于高位、低位、左移和右移几个概念,表面上看上去可以简单解释,但是恐只能让您得到初步的认知,而得不到精髓。讲的太专业的描述,可能又造成晦涩难懂。所以,为了深入浅出解答您这个问题,专门写了一篇文章,以形象的例子来说明这几个概念,道出其精髓,供您学习参考。

    对于这四个概念的针对性讲解,请阅读文章《深入浅出一举拿下晦涩的高位低位和左移右移》。那么这四个概念,就不在此处解释了。

    当然,请先看完上面这篇文章,再继续往下看。

    这里假设您已经看明白了左移的概念了。那么<<16和<<8的左移16位和左移8位,是针对*raw_image取值得到的内存的比特位进行移动操作。而最左边的比特位必然会因为左移而丢失,右侧空降的比特都自动用0填充。在多个左移之后得到多个比特序列,然后再进行位或,最终形成比特位的过滤。

    为了形象理解这个过程,请自己手动模拟一个过程:

1010  <<2      得到1000

1110  <<1      得到1100

两者相位或,得:  1100

    那么左移16和左移8是按照字节为单位在移动,因为一个字节8位。那么前面三个,第一个左移16位,第二个左移8位,第三个不动,三个做位或操作,即将三个比特序列依次位或,对应的两个比特位只要有一个是1就得到1,最后形成一个新的比特位序列。最后用0xff000000来做过滤,同样是比特位过滤,只不过,这个数字有特定的过滤方式,是选择性过滤的意思。

    对于位操作,最直观的就是,将十六进制数字转成二进制序列,然后上下排列整齐,再一个个比特位对应的操作一下就知道了,千万不要直接对十六进制数在脑子里进行比特位操作,会转不过来的。只有二进制对照的操作多了,就有感觉了。而对于比特位的操作,一位对一位的位运算,简直不能再简单了。

    最后将位操作之后的结果转为unsigned int类型的整数,就是最终的结果了。