WedX - журнал о программировании и компьютерных науках

c ++ обрезка и заполнение unsigned int в шестнадцатеричном формате для значения #RGB

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

  • 81892 (шестнадцатеричный: 13FE4) должен стать 13FE40 или 013FE4
  • 3285446057 (шестнадцатеричный: C3D3EDA9) должен стать C3D3ED или D3EDA9

Поскольку в проекте, в котором я участвую, используется Qt, я решаю проблему следующим образом:

unsigned int hex = qHash(name);
QString hexStr = (QString::number(hex, 16) + "000000").left(6);
bool ok;
unsigned int hexPat = hexStr.toUInt(&ok, 16);

Это дополняет строку шестнадцатеричных чисел справа, а затем обрезает ее после шестого символа слева. Чтобы сделать наоборот, я бы просто заменил вторую строку:

QString hexStr = ("000000" + QString::number(hex, 16)).right(6);

Значение будет использоваться для значений RGB, которые вот почему мне нужно шесть шестнадцатеричных цифр (три значения от 0 до 255).

Есть ли более эффективный способ достичь одного (или обоих) этих результатов без преобразования в строку, а затем обратно?


Ответы:


1

Фактическое требование для решения вашей проблемы: для целого числа без знака необходимо извлечь три байта.

На самом деле нет необходимости преобразовывать их в строку для их извлечения, это может быть более эффективно выполнено с помощью битовых операций.

Чтобы извлечь любой байт из целого числа, выполните сдвиг вправо (>>) на соответствующее количество бит (0, 8, 16 или 24) и AND результат с маской, которая занимает только крайний правый байт (0xFF, что на самом деле 0x000000FF) .

например возьмите три младших байта:

uint c = hash(...);
BYTE r = (BYTE)((c >> 16) & 0xFF);
BYTE g = (BYTE)((c >> 8) & 0xFF);
BYTE b = (BYTE)(c & 0xFF);

или три старших байта:

uint c = hash(...);
BYTE r = (BYTE)((c >> 24) & 0xFF);
BYTE g = (BYTE)((c >> 16) & 0xFF);
BYTE b = (BYTE)((c >> 8) & 0xFF);
01.11.2015
  • БАЙТ, как в stackoverflow.com/a/20025042/188159? Могу ли я использовать вместо этого int или unsigned int, чтобы ничего не включать и не определять новые типы? (Я чувствую, что должен это сделать, поскольку я почти не знаю проект, в который я участвую, и, вероятно, еще не знаю, какое влияние такие дополнения могут иметь на производительность и другие разделы кода) PS: Спасибо, что повторно сформулировали мой вопрос, это очень полезно для понимания процесса. 01.11.2015
  • Извините, я привык к Windows, я забыл, что это не часть языка. BYTE определяется как unsigned char. Вероятно, это может работать так же хорошо, хотя и менее конкретно, с int или uint, в зависимости от того, где значения должны быть позже. 01.11.2015
  • Спасибо за разъяснения. Меня особенно интересует использование наиболее значимых байтов (левая часть), но, к сожалению, ваш код, похоже, не обрабатывает короткие хэши. 1cf9e становится 00,01, cf вместо 1c, f9, e0 и ef становится 00,00,00 вместо ef, 00,00 rextester.com/PGV72502 (также происходит при использовании unsigned char, а не unsigned int) - меня также беспокоит, что это может быть несовместимо между 32- и 64-битными операционными системами? 02.11.2015
  • @qubodup Похоже, вас интересуют наименее значимые байты. 02.11.2015
  • Моя неопытность с битами / байтами заставляет меня говорить непонятные вещи, о которых я думаю. Меня интересуют три крайних левых байта, крайний левый из которых не равен нулю. 02.11.2015
  • крайний левый зависит от порядка байтов. Если у вас есть номер 0x12345678, который вы хотите получить 0x123456, но если у вас есть 0x00345678, вы хотите получить 0x345678? Вы можете проверить, является ли самый старший байт 0, а затем решить, какие 3 байта взять. 02.11.2015
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: wedx@cp9.ru