获取 Swift 中浮点数的原始字节
Get raw bytes of a float in Swift
如何读取 Swift 中 Float
或 Double
的原始字节?
示例:
let x = Float(1.5)
let bytes1: UInt32 = getRawBytes(x)
let bytes2: UInt32 = 0b00111111110000000000000000000000
我希望 bytes1
和 bytes2
包含相同的值,因为这个二进制数是 1.5
的 Float 表示。
我需要它来执行按位运算,例如 &
和 >>
(这些不是在浮点数上定义的)。
Swift3 的更新: 从 Swift3 开始,所有浮点类型
有 bitPattern
属性 其中 returns 一个无符号整数
相同的内存表示,以及相应的 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
for Float
,UInt64
for
Double
,Int
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))
如何读取 Swift 中 Float
或 Double
的原始字节?
示例:
let x = Float(1.5)
let bytes1: UInt32 = getRawBytes(x)
let bytes2: UInt32 = 0b00111111110000000000000000000000
我希望 bytes1
和 bytes2
包含相同的值,因为这个二进制数是 1.5
的 Float 表示。
我需要它来执行按位运算,例如 &
和 >>
(这些不是在浮点数上定义的)。
Swift3 的更新: 从 Swift3 开始,所有浮点类型
有 bitPattern
属性 其中 returns 一个无符号整数
相同的内存表示,以及相应的 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
for Float
,UInt64
for
Double
,Int
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))