代码之家  ›  专栏  ›  技术社区  ›  Hazior

基于整数幂函数的C#高效算法

  •  3
  • Hazior  · 技术社区  · 15 年前

    The most efficient way to implement an integer based power function pow(int, int) .

    我试图让它为C#工作,但我正在比较int和bool以及所有其他东西。我不明白他们为什么要比较&这难道不是真的吗?这有什么意义。这似乎效率不高。

     int ipow(int base, int exp) 
     { 
         int result = 1; 
         while (exp) 
         { 
             if (exp & 1) 
                 result *= base; 
             exp >>= 1; 
             base *= base; 
         } 
    
    return result; 
    

    }

    我正在做exp==的比较,但1仍然存在,我不知道我是否需要它。

    有人知道“如果”中的1是什么吗;1) “是给谁的?或者如果我需要它?我看不出有什么用。

    4 回复  |  直到 7 年前
        1
  •  8
  •   plinth    15 年前

    基本上在C和C++中,IF的条件是“如果表达式是非零”。

    因此,在这种情况下,您需要:

    while (exp != 0)
    

    if ((exp & 1) != 0) // If exp is odd
    

    base :)

    我还没有检查该算法在C#中是否有效,但这至少可以帮助您更进一步。

        2
  •  5
  •   Guffa    15 年前

    下面是该方法的C版本:

    int ipow(int base, int exp) {
       int result = 1; 
       while (exp > 0) {
          if ((exp & 1) != 0) { 
             result *= base;
          } 
          exp >>= 1; 
          base *= base; 
       } 
       return result; 
    }
    

    (正如乔恩指出的,你应该避免使用 base

    & 两个整数(exp和1)上的运算符这是一个二进制运算符。其目的是屏蔽exp值中最小的符号位。

    该方法所做的是遍历exp值中的位,并将乘以的基值乘以exp值中位的值。

    例如,如果exp值为21,即二进制的10101,位值为16+4+1。它不是将基值乘以21倍,而是将16*base、4*base和1*base相乘。

        3
  •  1
  •   synepis    15 年前

    假设你有

    int a = 5, b = 1;
    int c = a & b;
    

    您的“a”实际上是二进制的00000101,b是00000001。 当你做a&这意味着要对每一点都做一个和运算 数字。这意味着第一位是“and”,第二位是“and”,依此类推。

    可以使用or(“|”)运算符执行相同的操作。

    int d = a | b; //d = 00000101
    

        4
  •  0
  •   gbianchi    15 年前

    这里的问题是,C使用数字来获取布尔值。因此,将int与1进行比较将对这两个值执行AND运算,然后将结果作为布尔值进行计算。

    C#不会做同样的事情,你需要重新考虑这里的算法

        5
  •  0
  •   SunsetQuest    4 年前

    对于.NET5和更新版本,这里是最快的。。。

    int answer = (int)Math.Pow(x, pow);