В настоящее время я пытаюсь выучить 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. Есть ли что-то, что я делаю неправильно или отсутствует здесь?
Ваш 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
,
Других решений пока нет …