(biwidth*biBitCount/8+3)/4*4

转自:http://wenda.tianya.cn/question/510127906cc5c480

在VC++中,读入BMP图像必须把每行所占的字节数转换为4的倍数,用了这个公式(biwidth*biBitCount/8+3)/4*4,不明白其含义

注意:C语言的除法里,两个int相除,结果会被CUT掉——只取商而不取余数。
biwidth*biBitCount/8 好理解,就是一个扫描行的字节数(如:100 * 24/8,即100 * 3 ,有100个像素,每个像素有3个字节,所以每行总字节数为300)
记 b = biwidth*biBitCount/8,  那么, 原式 =(b+3)/4*4,
情况一,b是四的倍数,(b+3)/4*4 == (b/4*4 + 3/4*4) == b + 0 == b

(如上:300是4的倍数,所以(300+3)/4*4 == (300/4*4)+3/4*4 == 75*4+(3/4*4)(因C程序里两个int相除,只取整数所以3/4*4等于0 ),即结果为300 Bytes


情况二,b不是四的倍数
  另 b = 4x+n,其中4x就是x的4倍数,n就是那个余数。
  容易得知:1 <= n <= 3,   4 <= n+3 <= 6,
    于是,原式 ==  (4x+n + 3)/4*4, (其中x是任意值),
                       ==  (4x/4*4 + (n+3)/4*4)
    在C语言中  ==   4x + 4  == (x+1)*4
例如:
1. (16)/4*4 == 16, 
2. (18+3)/4*4 == (16+2+3)/4*4 == (16 + 5)/4*4 == (4+1)*4 == 20

   (33+3)/4*4 == (32+1+3)/4*4 == (32 + 4)/4*4 == (8+1)*4 == 36
   (34+3)/4*4 == (32+2+3)/4*4 == (32 + 5)/4*4 == (8+1)*4 == 36
   (35+3)/4*4 == (32+3+3)/4*4 == (32 + 6)/4*4 == (8+1)*4 == 36

原文地址:https://www.cnblogs.com/pamxy/p/2991454.html