如果您将大量调用这些方法,最快的方法不是位操作,而是查找表。为每个操作定义一个长度为511的数组。减号(减法)示例
static unsigned char maxTable[511];
memset(maxTable, 0, 255);
maxTable[255]=0;
for (int i=0; i<256; i++)
maxTable[255+i] = i;
该数组是静态的,仅初始化一次。现在,您的减法可以定义为内联方法或使用预编译器:
#define MINUS(A,B) maxTable[A-B+255];
这个怎么运作?好吧,您想预先计算未签名字符的所有可能的减法。结果从-255到+255不等,总共511个不同结果。我们定义了所有可能结果的数组,但是因为在C中我们无法从负索引访问它,所以我们使用+255(在[A-B + 255]中)。您可以通过定义指向数组中心的指针来删除此操作。
const unsigned char *result = maxTable+255;
#define MINUS(A,B) result[A-B];
像这样使用它:
bsub = MINUS(13,15)
请注意,执行速度非常快。只有一个减法和一个指针相依才能得出结果。没有分支。静态数组非常短,因此它们将被完全加载到CPU的缓存中,以进一步加快计算速度
相同的方法适用于加法,但表稍有不同(前256个元素将成为索引,而后255个元素将等于255,以模拟超过255的截止值。
如果坚持位操作,则使用(a> b)的答案是错误的。这仍然可以实现为分支。使用符号位技术
#define is_int_biggerNotEqual( num1,num2) ((((__int32)((num2)-(num1)))&0x80000000)>>31)
现在,您可以将其用于减法和加法计算。
如果要模拟函数max(),min()而不分支使用:
inline __int32 MIN_INT(__int32 x, __int32 y){ __int32 d=x-y; return y+(d&(d>>31)); }
inline __int32 MAX_INT(__int32 x, __int32 y){ __int32 d=x-y; return x-(d&(d>>31)); }
我上面的示例使用32位整数。您可以将其更改为64,尽管我认为32位计算的运行速度更快。由你决定
y ^ ((x ^ y) & -(x < y))
对int
各类评估min(x, y)
没有分支。根据目前的情况,这可能构成最终解决方案的一部分。