如何在C中实现逻辑移位的二次幂?

时间:2016-04-17 01:28:08

标签: c logical-operators

我只是从C开始,但我现在所做的只是一个简单的数学运算。我想要的是?我想要带有指数的函数并返回两个幂。我想使用逻辑移位运算符。 Wiki: Logical shifts

  

逻辑转换可以作为有效的执行方式   用2的幂乘以或除无符号整数。   在有符号或无符号二进制数上向左移位n位具有   乘以2n的效果。

但有一点我无法理解,它与大指数无法正常工作,例如32.下面代码中的详细信息。那么,如何在不使用数学库的情况下正确实现这样的功能?提前谢谢。

long power_of_two_ext(int exp) {
    exp = 32; // for testing purpose only

    long retL = pow(2, exp);
    printf("MATH pow() and long --->  %ld\n", retL);

    long retL2 = 1 << exp;
    printf("Shift bits left and long --->  %ld\n", retL2);

    long long retL3 = 1 << exp;
    printf("Left shift and long --->  %llu\n", retL3);
    return retL;
}

MATH pow() and long --->  4294967296
Left shift and long long --->  1
Left shift and long --->  1

1 个答案:

答案 0 :(得分:3)

1 << exp正在向左移int。仅仅因为您将结果分配给longlong long,并不意味着在该类型中计算表达式。如上所述,您的代码使用int,并且可能是在int为32位的机器上运行。 [注意:向左移动一个大于或等于整数类型宽度的未定义行为,因此代码的行为可能不一致]。

相反,请使用正确类型的常量来确保表达式的类型正确。

long retL2 = 1L << exp;
...
long long retL3 = 1LL << exp;