использовать
str.isalpha()
Ссылка: https://docs.python.org/2/library/stdtypes.html#str.isalpha
Возвращает true, если все символы в строке являются алфавитными и есть хотя бы один символ, иначе false.
blockquote>
Вы можете сдвинуть и затем или с наиболее значимыми битами; т.е.
Red 10101 becomes 10101000 | 101 => 10101101
12345 12345--- 123 12345123
Это свойство, которое вы ищете, но это не самое линейное отображение значений из одного пространства в другое. Хотя это быстро. :)
Ответ Клетуса более полный и, вероятно, лучше. :)
Попробуйте следующее:
red5 = (buf & 0xF800) >> 11;
red8 = (red5 << 3) | (red5 >> 2);
Это отобразит все нули во все нули, все единицы во все единицы и все, что между ними, во все, что между ними. Вы можете сделать его более эффективным, сдвинув биты на место за один шаг:
redmask = (buf & 0xF800);
rgb888 = (redmask << 8) | ((redmask<<3)&0x070000) | /* green, blue */
Сделайте то же самое для зеленого и синего (для 6 бит сдвиньте влево 2 и вправо 4 соответственно в верхнем методе).
Вы хотите отобразить каждое из этих значений из 5/6-битного пространства в 8-битное.
Код, который вы используете, использует наивный подход, что x5 * 256/32 = x8, где 256/32 = 8 и умножение на 8 - это сдвиг влево на 3, но, как вы говорите, это не обязательно "правильно" заполнит новое пространство чисел. От 5 до 8 для максимального значения - это от 31 до 255, и в этом кроется ключ к решению.
x8 = 255/31 * x5
x8 = 255/63 * x6
где x5
, x6
и x8
- 5, 6 и 8 битовые значения соответственно.
Теперь возникает вопрос о том, как лучше это реализовать. Это включает деление, а при целочисленном делении вы потеряете любой результат остатка (в основном, округление вниз), поэтому лучшим решением, вероятно, будет арифметика с плавающей запятой, а затем округление половины до целого числа.
Это можно значительно ускорить, просто используя эту формулу для создания таблицы поиска для каждого из 5 и 6-битных преобразований.
Общее решение - рассматривать числа как двоичные дроби - таким образом, 6-битное число 63/63 совпадает с 8-битным числом 255/255. . Вы можете сначала рассчитать это, используя математику с плавающей запятой, а затем вычислить таблицу поиска, как предлагают другие плакаты. Это также имеет то преимущество, что оно более интуитивно понятное, чем решения с битовой атакой. :)