读书人

windows 程序设计 位图跟Bitblt其中一

发布时间: 2013-02-06 14:02:20 作者: rapoo

windows 程序设计 位图和Bitblt其中一个数字不解
windows 程序设计 14章 其中一段 iWidthBytes = 2 * ((cx * cBitsPixel + 15) / 16) ;
我想问问其中的15是什么意义,为什么是15不是其他数字。求解释
还有 为什么不直接
iWidthBytes = (cx * cBitsPixel + 15)/8 ;
windows
[解决办法]
用通俗的话说,该语句的结果是最靠近(cx * cBitsPixel)的并且大于本身的16的倍数。例如,(cx * cBitsPixel)为20,那么iWidthBytes为32。大家应该都知道第一个语句为什么是乘以2再除以16,而不是直接除以8,为的是使iWidthBytes恒为偶数。
现在说下面一句。下面的语句看起来复杂些,运用到了逻辑运算符,我们慢慢来了解。我们暂时把(cx * cBitsPixel)看成cBytes。先看看为什么要加15,这就好像四舍五入一样,只不过它都是向上入的,也就是说,得到的值必须比自身大,在C语言中,我们要把一个数四舍五入时,通常是这样写的(int)(iNumber + 0.5)(假设iNumber是浮点型)。因为把一个数字强制转换成int类型,机器只是简单把小数抛掉,并没有达到四舍五入的效果。我们回到原来的语句,当cBytes+15时,是为了是它向上靠近,这样说可能不准确,但是它的效果和(int)(iNumber + 0.5)中的0.5是一样的。我们以(cBytes = 20)为例,假设现在在一台16位的电脑上运行语句,看为2进制码,20也就是0000 0000 0001 0100,我们加上15(0000 0000 0000 1111),等于35(0000 0000 0010 0011),然后再与~15(0111 1111 1111 0000),我们就得到
32(0000 0000 0010 0000),最后在 >> 3,就得出4(0000 0000 0000 0100),也就是字节数。
[解决办法]
(cx * cBitsPixel + 15) / 16 这是一种常写手法, 为了计算【满足类似这样条件:多余的算作整个】的整除结果。 比如有一个能装4个苹果的盒子,现在x个苹果, 那么需要多少个盒子? 计算方法就为(x+3)/4.

如果上面那个改为iWidthBytes = (cx * cBitsPixel + 15)/8; 就看不出来了, 那个15就变得毫无道理。

读书人网 >C语言

热点推荐