2014-01-08 51 views
0

什麼和爲什麼開發商在此行中添加16的十六進制值,然後用按位運算,隨後通過一個NOT:用位圖行寬度奇怪的按位操作,這是什麼意思? (爲什麼)

size_t bytesPerRow = ((width * 4) + 0x0000000F) & ~0x0000000F; 

他評論說,「對準16字節是好的」 , 他什麼意思?

- (CGContextRef)createBitmapContext { 
    CGRect boundingBox = CGPathGetBoundingBox(_mShape); 

    size_t width = CGRectGetWidth(boundingBox); 
    size_t height = CGRectGetHeight(boundingBox); 
    size_t bitsPerComponent = 8; 
    size_t bytesPerRow = ((width * 4) + 0x0000000F) & ~0x0000000F; // 16 byte aligned is good 

回答

2

AND與~0x0000000F = 0xFFFFFFF0(aka -16)向下舍入爲16的倍數,只需重置那些可能使其不是16的倍數(8,4,2和1)的位。

添加15(0x0000000F)首先使其四捨五入而不是減少。

0

該代碼將4個最低有效位設置爲零。如果該值是一個地址,它將在一個偶數16字節邊界上,「16字節對齊」。

這1A中的補這麼

~0x0000000F 

成爲

0xFFFFFFF0 

和荷蘭國際集團與另一個值將清除4個最低顯著位。

這是我們以前常常做的事情「回到當天」!

+0

所以你在說0xFFFFFF0是用來表示行結束? –

+0

當使用另一個數字時,它會將4個LSB置零,這將使其成爲16的倍數並且在一個平坦的邊界上。 – zaph

0

他添加0xf,然後掩蓋掉低4位(&〜0xf),以確保該值被四捨五入。如果他沒有添加0xf,它會下降。

1

size_t bytesPerRow = ((width * 4) + 0x0000000F) & ~0x0000000F;目的是這個值向上舍入到16個字節

1

目標是設定bytesPerRow爲16的最小倍數,其能夠保持數據的一排。這樣做是爲了在每個行地址是16字節對齊的情況下分配一個位圖,即16的倍數。對齊有許多可能的好處,包括利用它的優化。一些API也可能需要對齊。

相關問題