битовая манипуляция — отображение параметров из значения ARGB не работает?

Я разрабатывал простое консольное приложение, в котором вы вводите шестнадцатеричный код значения ARGB, и приложение сообщит вам из 255 красного, зеленого, синего и альфа-содержимого значения.

Например:

Enter a 32-bit RGBA color value in hexadecimal (e.g. FF7F3300): FF7F3300
Your color contains:
255 of 255 red
127 of 255 green
51 of 255 blue
0 of 255 alpha

Теоретически, так должно работать приложение. Но это не так. Отображает 0 для каждого цвета.

Я использовал тот же код, который я использовал для этого приложения в приложении C #, за исключением того, что с учетом синтаксиса, чтобы соответствовать языку, и он работал правильно.

Однако из-за недостатка знаний C ++ я не могу правильно отладить это приложение даже после получаса размышлений.

Мой код C ++, который я использовал для этого, выглядит следующим образом:

#include "stdafx.h" //Always imported for VisualStudio

#include <iostream> //For input/output operations

using namespace std; //To simplify code - no conflicting namespaces are being used, and yet the std namespace is used often

void introduce()
{
cout << "Welcome to 'ARGB to Decimal'! This program will take a hex ARGB colour value (such as FF7F3300) and output the colour parameters that this value stores.";
}

uint32_t getValue()
{
cout << "\n\nPlease enter an ARGB value: ";

uint32_t value;

cin >> hex >> value;

cout << hex << "You have selected an ARGB value of " << value;

return value; //Converted to hex due to bitwise operations that will be performed on this value
}

int main()
{
introduce();

uint32_t ARGBValue{ getValue() };

uint32_t bitComparison{ 0xFF000000 }; //Used as the right operand of a bitwise AND operator to single out the bits for each byte of the ARGB value (with its bits being shifted 8 bits to the right before the 2nd, 3rd, and 4th comparison, and so display the appropriate byte value for that parameter

cout << "\n\nThe selected value has the following parameter values (out of 255):\n- Alpha:\t"<< ((ARGBValue & bitComparison) >> 24)
<< "\n- Red:\t\t" << ((ARGBValue & (bitComparison >>= 8)) >> 16)
<< "\n- Green:\t" << ((ARGBValue & (bitComparison >>= 8)) >> 8)
<< "\n- Blue:\t\t" << (ARGBValue & (bitComparison >>= 8))
<< "\n\n";

system("pause");

return 0;
}

Это выделяет биты для каждого параметра в значении ARGB с помощью побитового оператора AND со значением параметра и значения bitComparison, которое включает набор из 8 битов в соответствующем месте, в котором биты для текущего параметра являются Выделены расположены.

Биты сравнения битов сдвинуты в пределах cout Заявление, как оно выполняется.

Буду признателен, если кто-нибудь скажет мне, как это исправить.

Вот пример вывода, который не работает:

Welcome to 'ARGB to Decimal'! This program will take a hex ARGB colour value (such as FF7F3300) and output the colour parameters that this value stores.

Please enter an ARGB value: FF7F3300
You have selected an ARGB value of ff7f3300

The selected value has the following parameter values (out of 255):
- Alpha:        0
- Red:          0
- Green:        0
- Blue:         0

Press any key to continue . . .

1

Решение

Это прекрасно скомпилируется и даст ожидаемый результат (скомпилировано с поддержкой g ++ c ++ 11):

#include <iostream> //For input/output operations
#include <cstdint>

void introduce()
{
std::cout << "Welcome to 'ARGB to Decimal'! This program will take a hex ARGB colour value (such as FF7F3300) and output the colour parameters that this value stores.";
}

uint32_t getValue()
{
std::cout << "\n\nPlease enter an ARGB value: ";
std::uint32_t value;
std::cin >> std::hex >> value;
std::cout << std::hex << "You have selected an ARGB value of " << value;
return value; //Converted to hex due to bitwise operations that will be performed on this value
}

int main()
{
introduce();

std::uint32_t ARGBValue{ getValue() };

std::cout << std::dec << "\n\nThe selected value has the following parameter values (out of 255):\n- Alpha:\t"<< ((ARGBValue >> 24) & 0xFF)
<< "\n- Red:\t\t"<< ((ARGBValue >> 16) & 0xFF)
<< "\n- Green:\t"<< ((ARGBValue >> 8) & 0xFF)
<< "\n- Blue:\t\t"<< (ARGBValue & 0xFF)
<< "\n\n";

return 0;
}
2

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

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