如何对浮点数执行按位运算

新手上路,请多包涵

我试过这个:

 float a = 1.4123;
a = a & (1 << 3);

我收到一个编译器错误,说 & 的操作数不能是浮点类型。

当我做:

 float a = 1.4123;
a = (int)a & (1 << 3);

我让程序运行。唯一的一点是,按位运算是对四舍五入后获得的数字的整数表示进行的。

以下也是不允许的。

 float a = 1.4123;
a = (void*)a & (1 << 3);

我不明白为什么 int 可以转换为 void* 但不能 float

我这样做是为了解决堆栈溢出问题 如何使用遗传算法求解线性方程组中描述的问题? .

原文由 Rohit Banga 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

在语言级别,没有“浮点数的按位运算”之类的东西。 C/C++ 中的按位运算处理数字的值表示。并且浮点数的值表示在 C/C++ 中没有定义(无符号整数在这方面是一个例外,因为它们的移位被定义为就像它们存储在 2 的补码中一样)。浮点数在值表示级别上没有位,这就是为什么您不能对它们应用按位运算的原因。

你所能做的就是分析浮点数占用的原始内存的位内容。为此,您需要使用下面建议的联合,或者(等效地,并且仅在 C++ 中)将浮点对象重新解释为 unsigned char 对象的数组,如

float f = 5;
unsigned char *c = reinterpret_cast<unsigned char *>(&f);
// inspect memory from c[0] to c[sizeof f - 1]

请不要尝试将 float 对象重新解释为 int 对象,正如其他答案所暗示的那样。这没有多大意义,并且不能保证在遵循严格别名规则优化的编译器中工作。在 C++ 中检查内存内容的正确方法是将其重新解释为 [signed/unsigned] char 的数组。

另请注意,从技术上讲,您不能保证系统上的浮点表示是 IEEE754(尽管在实践中,除非您明确允许它不是,然后仅针对 -0.0、±infinity 和 NaN)。

原文由 AnT stands with Russia 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以解决 严格混叠规则 并对 float 类型双关语作为 uint32_t 执行按位运算(如果您的实现定义了它,大多数情况下)通过使用 memcpy() :

 float a = 1.4123f;
uint32_t b;

std::memcpy(&b, &a, 4);
// perform bitwise operation
b &= 1u << 3;
std::memcpy(&a, &b, 4);

原文由 Patrick Roberts 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题