【问题标题】:Is it possible to find min/max of a number in x86 without using shifts or xor?是否可以在不使用移位或异或的情况下找到 x86 中数字的最小值/最大值?
【发布时间】:2015-05-02 16:12:16
【问题描述】:

我正在尝试在 x86 中编写最小/最大函数。我已经能够通过使用移位和使用 xor 来做到这一点,但我需要找到一种方法来编写它而不使用这些用途。有人可以引导我朝着正确的方向前进吗?

【问题讨论】:

  • > , < , if 语句,还有一些变量?
  • 为什么需要移位和异或来找到最小值和最大值以及为什么 x86 与它有关?
  • 你不能用CMOV吗?或者只是在 C 中编写 min 函数并使用 gcc -mtune=native -O2 -fverbose-asm -S 编译它...

标签: c x86


【解决方案1】:

最大函数示例:

int max(int *arr,int n){
    int max=arr[0];
    for(int i=0;i<n;i++)max=(arr[i]>max)?arr[i]:max;
    return max;
    }

这将采用整数数组 (arr) 及其大小 (n) 作为参数,并返回数组中包含的最大值。

要查找最小更改 max=(arr[i]&gt;max)?arr[i]:max;max=(arr[i]&lt;max)?arr[i]:max;

【讨论】:

  • 这是一个很好的解决方案,但 for 循环本身就涉及我无法使用的跳转。显然有一个分支预测解决方案,但我似乎无法弄清楚
  • 所以它毕竟是一个家庭作业......好吧,你不能处理没有循环的数组。如果实在不能使用循环,可以使用递归。
  • 现在如果你只是比较两个数字,一个简单的max = (a &gt; b ? a : b) 就可以了。
猜你喜欢
  • 2020-07-14
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2019-07-27
  • 2021-02-26
  • 1970-01-01
  • 2014-02-14
相关资源
最近更新 更多