2014-01-28 4 views
1

У меня есть список чисел в диапазоне 0-1023. Я хотел бы преобразовать их в целые числа, так что 1023 отображает до -1, 1022 карт до -2 и т. Д., Тогда как 0, 1, 2, .... 511 остаются неизменными.Передача десятичного целого числа без знака в целое число со знаком в python

Я придумал простой:

def convert(x): 
    return (x - 2**9) % 2**10 - 2**9 

есть лучший способ?

+1

В некоторых языках программирования '%' оператор дает отрицательный (или нулевое) значение для отрицательного левого операнда , поэтому код можно было бы сделать более ясным путем изменения '(x - 2 ** 9)' to '(x + 2 ** 9)'. Помимо этого, это кажется разумной реализацией. – Fraxtil

ответ

2

Naivest Возможное решение:

def convert(x): 
    if x >= 512: 
     x -= 1024 
    return x 
+0

В качестве альтернативы, уменьшая три строки до одной: 'return x, если x <512 else x - 1024' – John1024

+1

или' return x - 1024 * (x> = 512) ' –

+1

@rmartinjak, умножая на boolean, требуется, чтобы Python выполнял дополнительные и в результате это решение немного медленнее, чем другие. Ваше оригинальное решение и John1024 кажутся примерно эквивалентными. Тем не менее, я еще не провел тщательного тестирования. – Fraxtil

2
def convert(x): 
    return x - (x >> 9) * 1024 

Использование ctypes:

from ctypes import c_short 

def convert(x): 
    return c_short(x << 6).value >> 6 
+0

Отличный ответ, могу добавить некоторые пояснения – yota

Смежные вопросы