- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
关于 Bit Twiddling Hacks website提供以下算法以将整数四舍五入为下一个二的幂:
unsigned int v; // compute the next highest power of 2 of 32-bit v
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
我想编写一个元编程函数来计算相同的操作:
这是预期函数的形式:
template <typename Type,
// Something here (like a recursion index)
class = typename std::enable_if<std::is_integral<Type>::value>::type,
class = typename std::enable_if<std::is_unsigned<Type>::value>::type>
constexpr Type function(const Type value)
{
// Something here
}
怎么做?
示例:对于 value = 42
,它应该返回 64
最佳答案
这应该实现您给出的算法:
template<typename T>
constexpr T roundup_helper( T value, unsigned maxb, unsigned curb ) {
return maxb<=curb
? value
: roundup_helper( ((value-1) | ((value-1)>>curb))+1, maxb, curb << 1 )
;
}
template<typename T,
typename = typename enable_if<is_integral<T>::value>::type,
typename = typename enable_if<is_unsigned<T>::value>::type>
constexpr T roundup( T value ) {
return roundup_helper( value, sizeof(T)*CHAR_BIT, 1 );
}
至少,它在我的测试程序中似乎运行良好。
或者,您可以将 v-1
和 v+1
移出辅助函数,如下所示:
template<typename T>
constexpr T roundup_helper( T value, unsigned maxb, unsigned curb ) {
return maxb<=curb
? value
: roundup_helper( value | (value>>curb), maxb, curb << 1 )
;
}
template<typename T,
typename = typename enable_if<is_integral<T>::value>::type,
typename = typename enable_if<is_unsigned<T>::value>::type>
constexpr T roundup( T value ) {
return roundup_helper( value-1, sizeof(T)*CHAR_BIT, 1 )+1;
}
另一种可能性是利用默认参数并将其全部放在一个函数中:
template<typename T,
typename = typename enable_if<is_integral<T>::value>::type,
typename = typename enable_if<is_unsigned<T>::value>::type>
constexpr T roundup(
T value,
unsigned maxb = sizeof(T)*CHAR_BIT,
unsigned curb = 1
) {
return maxb<=curb
? value
: roundup( ((value-1) | ((value-1)>>curb))+1, maxb, curb << 1 )
;
}
关于c++ - 编译时递归函数来计算整数的下一次幂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21298285/
我根据维基百科页面上指定的基本算法在 Haskell 中实现了二次筛。它适用于大多数整数,但它无法找到 n 次幂的数字 N 的因式分解。对于偶数次幂(平方),算法循环,对于奇数次幂,我找到了几个平方模
我必须多次提高 10 的两倍。 有没有比使用数学库 pow(10,double) 更有效的方法?如果重要的话,我的 double 总是在 -5 到 -11 之间为负数。 我假设 pow(double,
我想写一个函数来返回 2 的下一个幂。因此,如果输入是 18,它将返回 32,这是系列 2、4、8、16、32、64 中下一个大于 18 的数字 如果输入是 40,它将返回 64。 目前我正在使用以下
环境 Ubuntu 17.04,Chrome 60。 在没有警告/错误的情况下在本地运行此示例:https://github.com/mdn/webgl-examples/tree/gh-pages/
我有一个这样的数字序列: 1.687155E21 3.981457E19 0.5532155E21 3.018843E21 2.0532155E21 4.5532155E21 3.1637913E19
谁能告诉我一种方法来找到获得已知值所需的 2 的幂。例如,假设我需要找到 32 的 2 的幂。换句话说,如果我知道某个值,如何找到给出该值的 2 的幂。 if the given value is 6
我有两个值,一个是 X 的基数,一个是 N 的幂,如何才能得到 X 的 N 次幂 ans。 任何代码将不胜感激。 最佳答案 你正在寻找这个: https://api.dartlang.org/stab
我很难找到解决这个问题的方法。我正在尝试用Java开发一个程序,该程序将一个数字作为输入并打印每个数字的幂总和,使得第n位数字的幂是第(n-1)位数字。然而,对于第一位数字,功率应该是最后一位数字的功
我已经做到了这一点,但我不知道如何进一步进行 #include int main() { int x,n,m,i; printf("Enter the value of x: "); scanf("%
如果我有一个介于 100 和 1000 之间的数字,我想得到值 3,因为 10^3 = 1000。同样,如果我有一个介于 10 和 100 之间的数字,我想得到值 2,因为 10^2是 100。 如果
我必须编写一个程序来计算 2 的 2010 次方 的次方并求出数字的总和。例如: if `2 power 12 => gives 4096 . So 4+0+9+6 = 19 . 现在我需要为 2 p
我在最近的比赛中遇到了一个问题。 我无法找到解决方案,并且还没有针对该问题的社论。 Question Link 我在这里引用问题陈述也是为了以防链接不起作用。 找出大于或等于 A 且小于或等于 B (
我找不到用于计算 2^n 的 SSE 指令对于 vector __m128i 32 位整数。 是否有执行以下伪代码的指令或函数? __m128i power_of_two(__m128i b) {
n 的 n 次方(即 n^n)是多项式吗? T(n) = 2T(n/2) + n^n 可以用master方法求解吗? 最佳答案 它不仅不是多项式,而且比阶乘还差。 O(n^n) 支配 O(n!)。同样
我是一名优秀的程序员,十分优秀!