获取 Swift 中浮点数的原始字节

Get raw bytes of a float in Swift

如何读取 Swift 中 FloatDouble 的原始字节?

示例:

let x = Float(1.5)
let bytes1: UInt32 = getRawBytes(x)
let bytes2: UInt32 = 0b00111111110000000000000000000000

我希望 bytes1bytes2 包含相同的值,因为这个二进制数是 1.5 的 Float 表示。

我需要它来执行按位运算,例如 &>>(这些不是在浮点数上定义的)。

Swift3 的更新: 从 Swift3 开始,所有浮点类型 有 bitPattern 属性 其中 returns 一个无符号整数 相同的内存表示,以及相应的 init(bitPattern:) 相反转换的构造函数。

示例: FloatUInt32

let x = Float(1.5)
let bytes1 = x.bitPattern
print(String(format: "%#08x", bytes1)) // 0x3fc00000

示例: UInt32Float

let bytes2 = UInt32(0x3fc00000)
let y = Float(bitPattern: bytes2)
print(y) // 1.5

您可以用同样的方式在 DoubleUInt64 之间转换, 或者在 CGFloatUInt.

之间

Swift 1.2Swift 2 的旧答案: Swift 浮点类型有一个 _toBitPattern() 方法:

let x = Float(1.5)
let bytes1 = x._toBitPattern()
print(String(format: "%#08x", bytes1)) // 0x3fc00000

let bytes2: UInt32 = 0b00111111110000000000000000000000
print(String(format: "%#08x", bytes2)) // 0x3fc00000

print(bytes1 == bytes2) // true

此方法是 FloatingPointType 协议的一部分 FloatDoubleCGFloat 符合:

/// A set of common requirements for Swift's floating point types.
protocol FloatingPointType : Strideable {
    typealias _BitsType
    static func _fromBitPattern(bits: _BitsType) -> Self
    func _toBitPattern() -> _BitsType

    // ...
}

(从 Swift 2 开始,这些定义在 API 文档,但它们仍然存在并像以前一样工作。)

_BitsType 的实际定义在 API 中不可见 文档,但它是 UInt32 for FloatUInt64 for DoubleInt CGFloat:

print(Float(1.0)._toBitPattern().dynamicType)
// Swift.UInt32

print(Double(1.0)._toBitPattern().dynamicType)
// Swift.UInt64

print(CGFloat(1.0)._toBitPattern().dynamicType)
// Swift.UInt

_fromBitPattern()可用于转换成其他 方向:

let y = Float._fromBitPattern(0x3fc00000)
print(y) // 1.5

您可以使用 unsafeBitCast,像这样:

let x = Float(1.5)
let bytes1: UInt32 = unsafeBitCast(x, UInt32.self)
let bytes2: UInt32 = 0b00111111110000000000000000000000
if (bytes1 == bytes2) {
    println ("Success")
}

当你 运行 上面的代码打印 "Success"

无法让它工作:

let x = Float(1.5)
let bytes1 = x.bitPattern
print(String(format: "%#08x", bytes1)) // 0x3fc00000

或者这个:

let bytes1: UInt32 = unsafeBitCast(x, UInt32.self)

所以我这样做了:

print(String(x.bitPattern, radix: 2))