Swift:将String形式的2的补码数转换为Double

时间:2016-01-25 16:24:11

标签: swift2

我有一个传感器,它以字符串形式生成2位补码的16位值。我需要用这些值做一些数学运算,所以最终我需要将其转换为双打。其中“f112”是2的补码示例值,它将生成-3822。

我非常喜欢Swift初学者,觉得必须有一个更简单的方法吗?

let value2 = UInt32("f112",radix:16)
if value2 > 32767 {
    // handle -ve values
    value5 = Int32(bitPattern:value2! | 0xFFFF0000)
} else {
    // +ve
    value5 = Int32(bitPattern:value2! )
}
let doubleValue = Double(value5)

2 个答案:

答案 0 :(得分:1)

可能有几个解决方案,这是一个。

首先,它创建UInt16值并将其转换为Int,以便能够进行32位数学运算。

如果设置了最高有效位,则减去0x10000(65536)。

let value2 = Int(UInt16("f112",radix:16)!)
let doubleValue = value2 > 0x7fff ?  Double(value2 - 0x10000) : Double(value2) 

或使用按位NOT运算符(~

let value2 = UInt16("f112",radix:16)!
let doubleValue = value2 > 0x7fff ? -Double(~value2 + 1) : Double(value2)

答案 1 :(得分:1)

我的解决方案与vadian的

略有不同
let str = "f112"
// if you are sure about str (so force unwrapping is fine)
let d = Double(Int16(bitPattern: UInt16(str, radix: 16)!)) // -3822

// or more 'safe' version, which return 0 in case of invalid parameter
let d0 = Double(Int16(bitPattern: UInt16(str, radix: 16) ?? 0)) // -3822

顺便说一下

Int16("f112", radix: 16) == nil // true!

对我来说看起来像个错误...