在C语言中,给我一个整数x
,并且仅需使用以下按位和逻辑运算符将x
乘以2:<< >> ~ | ^ &
。明确禁止+ and *
运算符。
这通常很容易,因为我可以做x << 1
。但是,此问题的目的是假定x包含单个精度float
值。
我认为假装x
是float
的目的是挑战我们思考位的浮点数,以及如何通过应用前面提到的移位和逻辑运算符正确地将它们相乘。
谈到移位浮点值时,我目前的理解是,移位时浮点数的位可能会被错误表示。它是否正确?如果没有,为什么? 否则,我的理解是正确的,而我将继续着手实现该目标。任何帮助将不胜感激!
答案 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
该解决方案不处理指数溢出-这需要调整尾数。