如何在C中使用不带乘法运算符的按位运算符乘以浮点数

时间:2019-02-14 22:38:11

标签: c binary bit-manipulation

在C语言中,给我一个整数x,并且仅需使用以下按位和逻辑运算符将x乘以2:<< >> ~ | ^ &。明确禁止+ and *运算符。

这通常很容易,因为我可以做x << 1。但是,此问题的目的是假定x包含单个精度float值。

我认为假装xfloat的目的是挑战我们思考位的浮点数,以及如何通过应用前面提到的移位和逻辑运算符正确地将它们相乘。

谈到移位浮点值时,我目前的理解是,移位时浮点数的位可能会被错误表示。它是否正确?如果没有,为什么? 否则,我的理解是正确的,而我将继续着手实现该目标。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您需要将指数增加1以使浮点值加倍。这可以通过带涟波的加法器来完成:

#include <stdio.h>
#include <stdint.h>

int main()
{
    float f = 3.14f ;           // Test value
    uint32_t* x = (int*)(&f) ;  // get "bits view" of test value

    // increment exponent
    uint32_t mask = 0x00800000 ;
    *x ^= mask ;
    while( (*x & mask) == 0 && 
           mask != 0x80000000 )
    {
        mask <<= 1 ;
        *x ^= mask ;
    } 

    // Show result
    printf( "%f", f ) ;

    return 0;
}

以上代码的输出为:

6.280000

该解决方案不处理指数溢出-这需要调整尾数。