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

时间:2015-04-11 15:39:56

标签: swift bitwise-operators ieee-754

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

示例:

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

我希望bytes1bytes2包含相同的值,因为此二进制数是1.5的浮点表示。

我需要它来执行像&>>这样的按位操作(这些操作没有在浮点数上定义)。

3 个答案:

答案 0 :(得分:11)

Swift 3的更新:从Swift 3开始,所有浮点类型 具有bitPattern属性,该属性返回带有的无符号整数 相同的内存表示,以及相应的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.2 的旧答案和 Swift 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中不可见 文档,但UInt32FloatUInt64为。{1}} Double的{​​{1}}和Int的{​​{1}}:

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()

答案 1 :(得分:3)

您可以使用unsafeBitCast,如下所示:

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

以上在您运行时打印"Success"

答案 2 :(得分:0)

无法使其发挥作用:

www.google.com/m?hl=en&gl=gb&client=ms-android-htc&source=android-browser-goto&q=outer.space

或者这个:

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

所以我选择了这个:

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