一个快速开方的函数
/* 来至 Quake 3 的源码 */
float
CarmSqrt(float x){union{int intPart;
float floatPart;
} convertor;
union{int intPart;
float floatPart;
} convertor2;
convertor.floatPart = x;
convertor2.floatPart = x;
convertor.intPart = 0x1FBCF800 + (convertor.intPart >> 1);
convertor2.intPart = 0x5f3759df - (convertor2.intPart >> 1);
return0.5f*(convertor.floatPart + (x * convertor2.floatPart));
}
参考链接:
http://greatsorcerer.go2.icpcn.com/info/fastsqrt.html
快速 double 转整型 union luai_Cast {double l_d; long l_l; };
#define lua_number2int(i,d) \{volatileunion luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }
参考链接:
double to int 神奇的 magic number
RGB565 的 alpha 混合 unsignedshort alpha_blender(unsignedint x,unsignedint y,unsignedint alpha){
x = (x | (x<<16)) & 0x7E0F81F;
y = (y | (y<<16)) & 0x7E0F81F;
unsignedint result = ((x - y) * alpha / 32 + y) & 0x7E0F81F;
return(unsignedshort)((result&0xFFFF) | (result>>16));
}
参考链接:
64K 色的 Alpha 混合
一个不错的字符串 hash 函数 unsignedlong hash(constchar *name,size_t len){unsignedlong h=(unsignedlong)len;
size_t step = (len>>5)+1;
for(size_t i=len; i>=step; i-=step)
h = h ^ ((h<<5)+(h>>2)+(unsignedlong)name[i-1]);
return h;
}
一个方便的 hash 函数应该散列的比较开,计算速度跟字符串长度关系不大,又不能只计算字符串的开头或末尾。这里的算法是从
Lua 中看来的。
关于脏矩形技术的演示 由于代码过长,单起一页:
脏矩形 demo参考链接:
Blog上的帖子:脏矩形演示demo
UTF8 到 UTF16 的转换(单个字符) int UTF8toUTF16(int c){signedchar *t=(signedchar*)&c;
int ret=*t &(0x0f | ((*t>>1) &0x1f) | ~(*t>>7));
int i;
assert ((*t & 0xc0) != 0x80);
for(i=1;i<3;i++){if((t[i] & 0xc0)!=0x80){break;
}
ret=ret<<6 | (t[i] & 0x3f);
}return ret;
}
这只是一个字符的转换,如果转换字符串,可以再做一点优化。