Преобразование целых в байты - PullRequest
3 голосов
/ 01 апреля 2010

Скажем, у меня есть целое число 13941412, которое я хочу разделить на байты (число на самом деле является цветом в форме 0x00bbggrr). Как бы Вы это сделали? В с, вы бы бросили число в байт, а затем сдвинуть биты. Как вы приводите к байту в Python?

Ответы [ 3 ]

13 голосов
/ 01 апреля 2010

Используйте побитовые математические операторы, "байты" уже есть:

def int_to_rgb(n):
    b = (n & 0xff0000) >> 16
    g = (n & 0x00ff00) >> 8
    r = (n & 0x0000ff)
    return (r, g, b)
2 голосов
/ 01 апреля 2010

Вы можете поразрядно & с 0xff получить первый байт, затем сдвинуть 8 бит и повторить, чтобы получить остальные 3 байта.

Редактировать: для цветов вы знаете, что вам нужны младшие три байта. Таким образом, вы можете использовать более хороший подход:

r = num & 0x0000ff
g = (num & 0x00ff00) >> 8
b = (num & 0xff0000) >> 16
0 голосов
/ 02 апреля 2010

Вот предложение по оптимизации, которое применяется на любом языке и не наносит ущерба читаемости.

Вместо этого:

b = (n & 0xff0000) >> 16
g = (n &   0xff00) >> 8
r = (n &     0xff)

используйте это:

b = (n >> 16) & 0xff
g = (n >>  8) & 0xff
r =  n        & 0xff

Две причины:

Меньшее число констант не медленнее и может быть быстрее.

Наличие меньших констант не медленнее и может быть быстрее - на языке, подобном C, может быть доступна более короткая машинная инструкция; в языке, подобном Python, реализация, вероятно, объединяет маленькие целые числа.

...