我看Charles Petzold 的windows程序设计碰到了许多问题,这是其中一个?

pumsscco 2005-11-03 12:57:08
iWidthBytes = (cx * cBitsPixel + 15) & ~15) >> 3 ;
这个应该怎么理解???
可能有错误吧!
但是iWidthBytes = ((cx * cBitsPixel + 15) & ~15) >> 3 ;
又应该怎么理解呢???????
...全文
123 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pumsscco 2005-11-04
  • 打赏
  • 举报
回复
希望能有更多的本书高手来指导我,谢谢大家!
lujun-cc 2005-11-03
  • 打赏
  • 举报
回复
楼主,
iWidthBytes = (cx * cBitsPixel + 15) & ~15) >> 3 ;
是计算Windows位图中每行象素数目的,在Windows中,在为位图分配内存时,位图中的每一行所占用的内存应该是偶数字节,这个计算公式是这样的:
iWidthBytes = 2*((cx * cBitsPixel + 15)/16)
所以,写成C语句,再采用以为操作提高效率,就得到了楼主给出的表达式了,至于这个表达式中的位操作的含义,看楼上的说明就会明白的!
vcan 2005-11-03
  • 打赏
  • 举报
回复
其实楼主没有把应用背景说出来,因此各位阅读就无法正确理解了。

1.代码目的:这段代码用来计算图片(估计是BMP文件)每行像素所占用的字节数量的。而此文件格式规定,字节长度2字节对齐,即不足2字节的按2字节计算。

2.第一种情况确实缺失了一个 (

变量含意:
cBitsPixel:每像素占用的bit数,
cx:每行像素个数

代码含意:
先+15,然后屏蔽低4bit,再向右移动3bit(即相当于除8),等效于int((n+15)/16*2)的效果,只是bit运算速度快,效率高,所以作者用这种计算方式

运算简单介绍:
~非符号,~15,即低4bit为0,其它高bit为1
&与运算,不多说,不明白的请参考任何C教材


VCAN
gnixemos 2005-11-03
  • 打赏
  • 举报
回复
不是少了一个(?
睡在床板下_ 2005-11-03
  • 打赏
  • 举报
回复
楼上说的和我感觉一样啊,& ,| ,和<< ,>> 我也没用过~~

这些知道意思就可以了
benlei999 2005-11-03
  • 打赏
  • 举报
回复
这中间有一些与、移位的操作(不是很常用的计算符),反正就是为了方便的计算出宽度。其实学这本书你不用理会这些细节。如果你一定要知道怎么计算的,可以查一下c的语法,自己推出来。老实说,我还没用过&和>>

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧