Obj C эквивалентно Double.doubleToLongBits - PullRequest
0 голосов
/ 05 ноября 2010

Я портирую некоторый Java-код на Objective C и знаю достаточно побитно, чтобы получить головную боль.Может кто-нибудь указать мне на objC эквиваленты Double.doubleToLongBits и Float.floatToIntBits?

Ответы [ 2 ]

5 голосов
/ 05 ноября 2010

Как заметил жожоба , long не гарантированно будет иметь ширину 64 бита (хотя он ошибочно говорит, что это 32 бита - long имеет ширину 64 бита в Objective-C на 64 платформы). Тем не менее, я бы использовал фактический тип фиксированной ширины вместо long long.

#include <stdint.h>

uint64_t doubleToBits(double x) {
    const union { double f; uint64_t i; } xUnion = { .f = x };
    return xUnion.i;
}

uint32_t floatToBits(float x) {
    const union { float f; uint32_t i; } xUnion = { .f = x };
    return xUnion.i;
}
3 голосов
/ 05 ноября 2010

Нет безопасного способа присвоить биты double для long в Objective C. В Java, long и double - это 64 бита.В некоторых случаях для Objective C long - 32 бита, а double - 64 бита.

Вместо этого следует использовать long long.

int intValue = *((int*)(&floatValue));
long long llValue = *((long long*)(&doubleValue));
...