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

pamxy發表於2013-03-22

轉自: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