如何在Swift中读取Float
或Double
的原始字节?
示例:
let x = Float(1.5)
let bytes1: UInt32 = getRawBytes(x)
let bytes2: UInt32 = 0b00111111110000000000000000000000
我希望bytes1
和bytes2
包含相同的值,因为此二进制数是1.5
的浮点表示。
我需要它来执行像&
和>>
这样的按位操作(这些操作没有在浮点数上定义)。
答案 0 :(得分:11)
Swift 3的更新:从Swift 3开始,所有浮点类型
具有bitPattern
属性,该属性返回带有的无符号整数
相同的内存表示,以及相应的init(bitPattern:)
相反转换的构造函数。
示例: Float
到UInt32
:
let x = Float(1.5)
let bytes1 = x.bitPattern
print(String(format: "%#08x", bytes1)) // 0x3fc00000
示例: UInt32
到Float
:
let bytes2 = UInt32(0x3fc00000)
let y = Float(bitPattern: bytes2)
print(y) // 1.5
以同样的方式,您可以在Double
和UInt64
之间进行转换,
或CGFloat
和UInt
之间。
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
协议的一部分
Float
,Double
和CGFloat
符合的地方:
/// 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
为Float
,UInt64
为。{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)