3

我发现这个来源很好用,我只想问一下我没有得到的这段代码:

//calculate total size of RGBQUAD scanlines (DWORD aligned)

    bih.biSizeImage = (((bih.biWidth * 3) + 3) & 0xFFFC) * bih.biHeight ;

我明白为什么有“*3”,但没有得到“+3”和FFFC hexa的按位与。有人可以解释一下为什么他以这种方式计算图像的大小吗?

谢谢

4

1 回答 1

1

如果您尝试使用各种值,您会发现它实际上迫使 (width * 3) 向上舍入到包含它的 4 的最小倍数。他可能这样做是为了强制使事物保持 32 位对齐。

使用蟒蛇:

>>> f = lambda x: ((x * 3) + 3) & 0xFFFC
>>> [f(x) for x in range(1, 20)]
[4, 8, 12, 12, 16, 20, 24, 24, 28, 32, 36, 36, 40, 44, 48, 48, 52, 56, 60]

下面显示了直接乘法和向上舍入到 4 的倍数之间的区别

>>> [(3*x, f(x)) for x in range(1, 8)]
[(3, 4), (6, 8), (9, 12), (12, 12), (15, 16), (18, 20), (21, 24)]

我很惊讶代码实际上并没有记录这个事实。玩弄比特是一件很棒的事情,但它看起来很随意。

于 2011-04-23T22:28:57.077 回答