gpt4 book ai didi

c++ - 如何在 C++ 上的 "double"上使用按位运算符?

转载 作者:可可西里 更新时间:2023-11-01 16:54:19 28 4
gpt4 key购买 nike

我被要求在 C 中获取不同类型的内部二进制表示。我的程序目前可以很好地处理“int”,但我想将它与“double”和“float”一起使用。我的代码如下所示:

template <typename T>
string findBin(T x) {
string binary;
for(int i = 4096 ; i >= 1; i/=2) {
if((x & i) != 0) binary += "1";
else binary += "0";
}
return binary;
}

当我尝试使用“double”或“float”实例化模板时,程序失败。

最佳答案

简而言之,你不需要。

按位运算符在应用于 double 时没有意义或 float ,并且标准表示按位运算符( ~&|^>><< 和赋值变体)不接受 doublefloat操作数。

两者都是 doublefloat有 3 个部分 - 符号位、指数和尾数。假设你可以移动一个 double正确的。指数,特别是,意味着没有简单的转换来将位模式右移 - 符号位将移动到指数中,并且指数的最低有效位将移动到尾数中,完全不明显的集合意义。在 IEEE 754 中,实际尾数位前面隐含了 1 位,这也使解释变得复杂。

类似的评论适用于任何其他位运算符。

所以,因为对 double 的位运算符没有合理或有用的解释值,标准不允许。


来自评论:

I'm only interested in the binary representation. I just want to print it, not do anything useful with it.

此代码是几年前为 SPARC(大端)架构编写的。

#include <stdio.h>

union u_double
{
double dbl;
char data[sizeof(double)];
};

union u_float
{
float flt;
char data[sizeof(float)];
};

static void dump_float(union u_float f)
{
int exp;
long mant;

printf("32-bit float: sign: %d, ", (f.data[0] & 0x80) >> 7);
exp = ((f.data[0] & 0x7F) << 1) | ((f.data[1] & 0x80) >> 7);
printf("expt: %4d (unbiassed %5d), ", exp, exp - 127);
mant = ((((f.data[1] & 0x7F) << 8) | (f.data[2] & 0xFF)) << 8) | (f.data[3] & 0xFF);
printf("mant: %16ld (0x%06lX)\n", mant, mant);
}

static void dump_double(union u_double d)
{
int exp;
long long mant;

printf("64-bit float: sign: %d, ", (d.data[0] & 0x80) >> 7);
exp = ((d.data[0] & 0x7F) << 4) | ((d.data[1] & 0xF0) >> 4);
printf("expt: %4d (unbiassed %5d), ", exp, exp - 1023);
mant = ((((d.data[1] & 0x0F) << 8) | (d.data[2] & 0xFF)) << 8) | (d.data[3] & 0xFF);
mant = (mant << 32) | ((((((d.data[4] & 0xFF) << 8) | (d.data[5] & 0xFF)) << 8) | (d.data[6] & 0xFF)) << 8) | (d.data[7] & 0xFF);
printf("mant: %16lld (0x%013llX)\n", mant, mant);
}

static void print_value(double v)
{
union u_double d;
union u_float f;

f.flt = v;
d.dbl = v;

printf("SPARC: float/double of %g\n", v);
// image_print(stdout, 0, f.data, sizeof(f.data));
// image_print(stdout, 0, d.data, sizeof(d.data));
dump_float(f);
dump_double(d);
}


int main(void)
{
print_value(+1.0);
print_value(+2.0);
print_value(+3.0);
print_value( 0.0);
print_value(-3.0);
print_value(+3.1415926535897932);
print_value(+1e126);
return(0);
}

注释掉的“image_print()”函数以十六进制打印任意字节集,并进行了各种小调整。如果您需要代码,请与我联系(查看我的个人资料)。

如果您使用的是 Intel(小端),您可能需要调整代码以处理反向位顺序。但它显示了如何做到这一点 - 使用 union .

关于c++ - 如何在 C++ 上的 "double"上使用按位运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4743115/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com