将浮点数转换成整数

通常情况下,整数排序比浮点数排序快。这是因为整数排序只需要比较整数的大小,而浮点数排序需要比较浮点数的大小并考虑其精度。由于浮点数具有更多的可能取值,因此在排序时需要更多的比较操作,从而导致排序速度较慢。

以下是将浮点数转换成整数的方法:

/// Templates that contains signed and unsigned integer types of the given number of bits.
template <size_t Bits>
struct SizedIntegerType {
    static_assert(Bits <= 8);
    using Signed   = int8_t;
    using Unsigned = uint8_t;
};

template <>
struct SizedIntegerType<64> {
    using Signed   = int64_t;
    using Unsigned = uint64_t;
};

template <>
struct SizedIntegerType<32> {
    using Signed   = int32_t;
    using Unsigned = uint32_t;
};

template <>
struct SizedIntegerType<16> {
    using Signed   = int16_t;
    using Unsigned = uint16_t;
};


/// Creates a radix sort key from a floating point value.
template <typename T, std::enable_if_t<std::is_floating_point<T>::value, int> = 0>
static typename SizedIntegerType<sizeof(T) * CHAR_BIT>::Unsigned make_key(T x) {
        using U = typename SizedIntegerType<sizeof(T) * CHAR_BIT>::Unsigned;
        using I = typename SizedIntegerType<sizeof(T) * CHAR_BIT>::Signed;
        auto mask = U(1) << (sizeof(T) * CHAR_BIT - 1);
        auto y = as<U>(x);
        return (y & mask ? static_cast<U>(-static_cast<I>(y)) ^ mask : y) ^ mask;
    }

make_key函数的基本原理:   

以float类型举例,mask为符号位的掩码10000000 00000000  00000000  00000000 ,如果浮点数是负数,则符号位取反变为0,保留尾数,与mask两次异或运算之后符号位和尾数都不变,1xxxxxxx xxxxxxxx  xxxxxxxx xxxxxxxx →  0xxxxxxx xxxxxxxx  xxxxxxxx xxxxxxxx ;

如果是正数,与mask一次异之后,符号位变为1,尾数不变,0xxxxxxx xxxxxxxx  xxxxxxxx xxxxxxxx → 1xxxxxxx xxxxxxxx  xxxxxxxx xxxxxxxx

转换之后,正浮点数转换值依然大于负浮点数转换值

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值