开始看power函数的版本二时,有点迷糊,这里用了十进制数的二进制表示法。
十进制数,这里n0,n1,n2,…,nk等于0或1,
则。
举个例子: 13=20+22+23=(1101)2,
令result初始值为1,因此要计算xn,只要将n化为二进制并由低位到高位依次判断,如果第i位为1,则。
int power(int x, unsigned n){ if (n == 0) return 1; else{ int result = 1; while (n != 0){ if ((n & 1) != 0) result *= x; x *= x; n >>= 1; } return result; } }
STL的power函数为了进一步提高效率,又做了优化。比如 32=(100000)2这种低位有很多0的数,可以先过滤掉低位的0再进行计算。
template <class T, class Integer, class MonoidOperation> T power(T x, Integer n, MonoidOperation op) { if (n == 0) return identity_element(op); else { while ((n & 1) == 0) { n >>= 1; x = op(x, x); } T result = x; n >>= 1; while (n != 0) { x = op(x, x); if ((n & 1) != 0) result = op(result, x); n >>= 1; } return result; } }
参考:http://blog.csdn.net/morewindows/article/details/7174143