我试过这个:
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 许可协议
在语言级别,没有“浮点数的按位运算”之类的东西。 C/C++ 中的按位运算处理数字的值表示。并且浮点数的值表示在 C/C++ 中没有定义(无符号整数在这方面是一个例外,因为它们的移位被定义为就像它们存储在 2 的补码中一样)。浮点数在值表示级别上没有位,这就是为什么您不能对它们应用按位运算的原因。
你所能做的就是分析浮点数占用的原始内存的位内容。为此,您需要使用下面建议的联合,或者(等效地,并且仅在 C++ 中)将浮点对象重新解释为
unsigned char
对象的数组,如请不要尝试将
float
对象重新解释为int
对象,正如其他答案所暗示的那样。这没有多大意义,并且不能保证在遵循严格别名规则优化的编译器中工作。在 C++ 中检查内存内容的正确方法是将其重新解释为[signed/unsigned] char
的数组。另请注意,从技术上讲,您不能保证系统上的浮点表示是 IEEE754(尽管在实践中,除非您明确允许它不是,然后仅针对 -0.0、±infinity 和 NaN)。