Сдвиг битов в шестнадцатеричном формате в визуальной студии и вывод через cout

В настоящее время я пытаюсь выучить c ++, следуя инструкциям онлайн. Из этого туториала я узнаю, как создать программу с использованием SDL2, и я заблудился в одном из уроков, связанных со смещением битов в шестнадцатеричном формате. Лектор использует Eclipse IDE, в то время как я использую сообщество Visual Studio 2017. По сути, я пытаюсь сделать так, чтобы «cout» вывел это: FF123456, используя код, который он продемонстрировал в этом руководстве.

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

int main()
{
//0xFF123456 we want the resulting hexadecimal below to look like the one up here using the unsigned chars and build it sequentially byte after byte

unsigned char alpha = 0xFF;
unsigned char red = 0x12;
unsigned char blue = 0x34;
unsigned char green = 0x56;

unsigned char color = alpha;

color += alpha;
color <<= 8; //moves all the values in the color by 8 bits to the left
color += red;
color <<= 8;
color += blue;
color <<= 8;
color <<= green;cout << setfill('0') << setw(8) << hex << color << endl;
return 0;
}

Однако каждый раз, когда я запускаю программу, cout будет отображать только «0000000» вместо FF123456. Есть ли что-то, что я делаю неправильно или отсутствует здесь?

-1

Решение

Ваш color является беззнаковым символом, который обозначает один байт, а не четыре. Следовательно, каждая смена <<= 8 на самом деле сотрет все, что было назначено ранее.
Используйте unsigned int или лучше uint32_tтип для color, Далее вы инициализируете color со значением alpha, а затем вы добавляете alpha второй раз. Предложить для инициализации color с 0:

uint32_t color = 0;

color += alpha;
color <<= 8; //moves all the values in the color by 8 bits to the left
color += red;
color <<= 8;
color += blue;
color <<= 8;
color += green;

cout << setfill('0') << std::uppercase << setw(8) << hex << color << endl;

Выход:

FF123456

Кстати: исправлена ​​опечатка, изменено color <<= green в color += green,
И, чтобы получить FF123456 вместо ff123456, Я добавил std::uppercase,

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector