C++ 错误:二进制表达式的无效操作数('float'和'float')返回(x&(1

C++ 错误:二进制表达式的无效操作数('float'和'float')返回(x&(1,c++,C++,嗨,我有这样一个代码: STATIC bool is_pos_float(float x) { return (x & (1 << 31)) == 0; } 但编译后,它显示: error: invalid operands to binary expression ('float' and 'float') return (x & (1 << 31)) == 0; 有什么问题吗?你打算怎么办?玩浮点变量的位 如果您计划确保x为正或为零,那么解

嗨,我有这样一个代码:

STATIC bool is_pos_float(float x) {
  return (x & (1 << 31)) == 0;
}
但编译后,它显示:

error: invalid operands to binary expression ('float' and 'float')
  return (x & (1 << 31)) == 0;

有什么问题吗?

你打算怎么办?玩浮点变量的位


如果您计划确保x为正或为零,那么解决方案就是使用!x内置运算符&的左操作数必须是整数类型,而不是浮点。改为这样做

inline bool is_pos_float(float x) {
  return x > 0.0f;
}
编辑。假设OP真正想要的是浮点格式,我认为如果机器是Little Endian的话,这会起作用

bool high_bit_zero(float x) {
    constexpr unsigned sz = sizeof(float);
    using raw = unsigned char[sz];
    raw *c = reinterpret_cast<raw*>(&x);
    return !((*c)[sz-1] & (1 << 7));
}

您需要将浮点x的一个位拷贝作为一个整数。浮点值在按位操作中没有意义。还要注意,您的代码依赖于浮点格式的特定于实现的细节。最后,如果您想知道浮点值是否为负值,为什么不简单地进行比较呢?如x>=0.0f?我的第一个猜测是,不能在按位操作中使用浮点。错误信息似乎很清楚。intx的可能副本与您所暗示的转换有很大不同。@MadPhysician,谢谢,请看一下我的修复方法。分配给并集的一个元素,然后读取另一个元素是未定义的行为。您需要将memcpy放入一个字符数组,或者const auto c=reinterpret_cast&x;`然后用c作为指向字符数组的指针。你为什么建议!x=0?您的测试用例需要考虑+INF、-INF和NaN。这些都是棘手的问题。关于表示法的假设最少。尽管函数名不同,问题的代码似乎试图在0.0f时返回true。你的回答不会那么做。在您的回答中可能值得一提。@hvd-我添加的high_bit_zero函数对于-0.0f返回false,对于+0.0f返回true。
inline bool is_pos_float(float x) {
  return x > 0.0f;
}
bool high_bit_zero(float x) {
    constexpr unsigned sz = sizeof(float);
    using raw = unsigned char[sz];
    raw *c = reinterpret_cast<raw*>(&x);
    return !((*c)[sz-1] & (1 << 7));
}