我有一个传感器,它以字符串形式生成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)
答案 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!
对我来说看起来像个错误...