2015-08-07 3 views
3

Я работаю с данными акселерометра Pebble и должен преобразовывать беззнаковые представления отрицательных int к нормальным числам (обратите внимание на первые два, например).Unsigned Int to negative Int in Swift

[X: 4294967241, Z: 4294967202, Y: 22] [X: 4294967278, Z: 4294967270, Y: 46] [X: 4294967274, Z: 4294967278, Y: 26] [X: 4294967221, Z: 85, Y: 4294967280] [X: 4294967247, Z: 117, Y: 4294967266]

Использование Objective C Я сумел сделать это с помощью простого [number intValue]. Однако, используя Swift, я не могу найти способ сделать это. Я пробовал Int(number), но получаю то же значение.

+0

Я читаю unsigned negative int right? Вы также можете просто использовать абс, чтобы получить абсолютное значение Int. –

+0

Беззнаковое отрицательное число не существует, вы имеете в виду отрицательный подписанный, может быть? – Kametrixom

+0

Можете ли вы добавить больше примеров значений, которые вы получаете? И каков тип этих значений? UInt32? Int32? Int16? – Kametrixom

ответ

0

Вы просто пытаетесь преобразовать беззнаковое представление отрицательного числа в его подписанное представление? Если да, то это должно работать:

let negativeValue = Int((incomingValue - 0xffffffff) % 0xffffffff) 
+1

'%' имеет более высокую точность, чем '-', я думаю, вам нужны скобки – Kametrixom

+0

Это не работает, оно просто превращает все мои значения в отрицательные. –

+0

@MartiSerraVivancos Возможно, значения ARE отрицательные? – Kametrixom

3

Вы всегда можете сделать unsafeBitcast если вы получили неправильный тип:

unsafeBitCast(UInt32(4294967009), Int32.self) // -287 

Это, например, преобразующий UInt32 к Int32

EDIT: vacawama показал лучшее решение без неприятных unsafe:

Int32(bitPattern: 4294967009) 

Большое спасибо! Используйте этот вместо этого, это безопасно (очевидно) и, вероятно, быстрее

+0

это правильный ответ – GoatInTheMachine

+0

Это сработало! Спасибо!! –

+2

Может также быть сделано с 'Int32 (битPattern: 4294967009)', который не имеет этого неприятного слова 'unsafe'. :-) – vacawama

2

Вы можете использовать bitPattern в конструкторе для преобразования без знака подписанному:

let x = Int32(bitPattern: 4294967009) 
print(x) // prints "-287" 

или если значение уже хранится в переменной:

let x: UInt32 = 4294967241 
let y = Int32(bitPattern: x) 
print(y) // prints "-55" 

Если значение хранится в виде 64-битных UInt, вам нужно использовать truncatingBitPattern при преобразовании в Int32:

let x: UInt = 4294967241 
let y = Int(Int32(truncatingBitPattern: x)) 
print(y) // prints "-55"