if (x255)x=255;

//顏色範圍0-255;
// 1.原始:
if (tem_b<0)tem_b=0;else if (tem_b>255)tem_b=255;
if (tem_g<0)tem_g=0;else if (tem_g>255)tem_g=255;
if (tem_r<0)tem_r=0;else if (tem_r>255)tem_r=255;

//2.使用條件狀態值生成掩碼來移除條件分支
tem_b &=-(tem_b>=0);//求負是爲了生成掩碼,也可以減1來生成掩碼 <0
tem_b = (tem_b | -(tem_b>255) ) & 0xFF;//>255
tem_g &=-(tem_g>=0);
tem_g = (tem_g | -(tem_g>255) ) & 0xFF;
tem_r &=-(tem_r>=0);
tem_r = (tem_r | -(tem_r>255) ) & 0xFF;

//3.使用帶符號的移位生成掩碼來移除條件分支 (建議使用該方案替代上面的條件狀態值方案)
tem_b &=~(tem_b>>31);  
tem_b = (tem_b | ((255-tem_b)>>31) ) & 0xFF;
tem_g &=~(tem_g>>31);
tem_g = (tem_g | ((255-tem_g)>>31) ) & 0xFF;
tem_r &=~(tem_r>>31);
tem_r = (tem_r | ((255-tem_r)>>31) ) & 0xFF;

//4.查表移除分支;
unsigned char_color_table[256+768+1];//假設color屬於[-256..512] 
unsigned char*color_table=&_color_table[256];//先偏移256
//初始化 color_table;
for  ( int  i = -256;i<768 ; i++)
{
if (i<0) color_table[i]=0;
else if (i>255) color_table[i]=255;
else color_table[i]=i;
}
...
resultRow[3*x]=color_table[tem_b];
resultRow[3*x+1]=color_table[tem_g];
resultRow[3*x+2]=color_table[tem_r]; 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章