如何优化基于8位无符号整数的布尔计算函数以提升速度?
位运算优化需求与实现
问题定义
输入两个8位无符号整数a、b,输出仅为-1或1,运算规则如下:
- 步骤1:通过异或消除共位,计算
aANb = a & (a ^ b)、bANa = b & (a ^ b); - 步骤2:统计
bANa中每一个1位右侧(含当前位)aANb的1位数量,将这些数量求和; - 步骤3:若总和为偶数返回
1,奇数则返回-1。
示例
当a=173、b=154时:
a二进制:10101101b二进制:10011010- 计算得
aANb=00100101,bANa=00010010 - 求和结果为3(奇数),返回
-1
当前C#实现代码
int a = 173; int b = 154; int sum = 0; int aANb = 0; int bANa = 0; for (int i = 0; i < 8; i++) { aANb = a & (a ^ b); bANa = b & (a ^ b); if ((bANa >> i) % 2 == 1) { for (int j = i; j < 8; j++) { sum += (aANb >> j) % 2; } } } int[] answer = { 1, -1 }; string result = $"a={a}\n" + $"b={b}\n" + $"binary a={Convert.ToString(a, 2).PadLeft(8, '0')}\n" + $"binary b={Convert.ToString(b, 2).PadLeft(8, '0')}\n" + $" aANb={Convert.ToString(aANb,2).PadLeft(8, '0')}\n" + $" bANa={Convert.ToString(bANa,2).PadLeft(8, '0')}\n" + $"sum={sum}\n" + $"result={answer[sum % 2]}"; System.Console.WriteLine(result);
代码输出
a=173 b=154 binary a=10101101 binary b=10011010 aANb=00100101 bANa=00010010 sum=3 result=-1 >>>result=-1
优化需求
目标平台为x86,因需开源无法确定具体CPU型号,希望优化函数运行速度。注意到aANb中连续成对的1位不会改变结果,考虑将位串分解为小块并采用查表法优化。
内容的提问来源于stack exchange,提问作者Colim
相关产品推荐
相关产品推荐

