#include <iostream>
#include <stdexcept>
 
#define GET_COMPONENT(color, index) (((0xFF << (index * 8)) & color) >> (index * 8))
 
unsigned int get_component(unsigned int color, unsigned int index)
{
    const unsigned int shift = index * 8;
    const unsigned int mask = 0xFF << shift;
    return (color & mask) >> shift;
}
 
enum color_component
{
    A,B,G,R
};
 
unsigned int get_component(unsigned int color, color_component component)
{
    switch (component)
    {
        case R:
        case G:
        case B:
        case A:
        {
            const unsigned int shift = component * 8;
            const unsigned int mask = 0xFF << shift;
            return (color & mask) >> shift;            
        }
 
        default:
            throw std::invalid_argument("invalid color component");
    }
 
    return 0;
}
 
int main(int argc, char **argv)
{
    unsigned int the_color = 0xAABBCCFF;
    std::cout << std::hex << "With macro:\n"
        << "R: " << GET_COMPONENT(the_color, 3) << '\n'
        << "G: " << GET_COMPONENT(the_color, 2) << '\n'
        << "B: " << GET_COMPONENT(the_color, 1) << '\n'
        << "A: " << GET_COMPONENT(the_color, 0) << '\n';
 
    std::cout << std::hex << "With function:\n"
        << "R: " << get_component(the_color, 3) << '\n'
        << "G: " << get_component(the_color, 2) << '\n'
        << "B: " << get_component(the_color, 1) << '\n'
        << "A: " << get_component(the_color, 0) << '\n';
 
    std::cout << std::hex << "With function:\n"
        << "R: " << get_component(the_color, R) << '\n'
        << "G: " << get_component(the_color, G) << '\n'
        << "B: " << get_component(the_color, B) << '\n'
        << "A: " << get_component(the_color, A) << '\n';
 
    return 0;
}
 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKI2RlZmluZSBHRVRfQ09NUE9ORU5UKGNvbG9yLCBpbmRleCkgKCgoMHhGRiA8PCAoaW5kZXggKiA4KSkgJiBjb2xvcikgPj4gKGluZGV4ICogOCkpCgp1bnNpZ25lZCBpbnQgZ2V0X2NvbXBvbmVudCh1bnNpZ25lZCBpbnQgY29sb3IsIHVuc2lnbmVkIGludCBpbmRleCkKewogICAgY29uc3QgdW5zaWduZWQgaW50IHNoaWZ0ID0gaW5kZXggKiA4OwogICAgY29uc3QgdW5zaWduZWQgaW50IG1hc2sgPSAweEZGIDw8IHNoaWZ0OwogICAgcmV0dXJuIChjb2xvciAmIG1hc2spID4+IHNoaWZ0Owp9CgplbnVtIGNvbG9yX2NvbXBvbmVudAp7CiAgICBBLEIsRyxSCn07Cgp1bnNpZ25lZCBpbnQgZ2V0X2NvbXBvbmVudCh1bnNpZ25lZCBpbnQgY29sb3IsIGNvbG9yX2NvbXBvbmVudCBjb21wb25lbnQpCnsKICAgIHN3aXRjaCAoY29tcG9uZW50KQogICAgewogICAgICAgIGNhc2UgUjoKICAgICAgICBjYXNlIEc6CiAgICAgICAgY2FzZSBCOgogICAgICAgIGNhc2UgQToKICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzaGlmdCA9IGNvbXBvbmVudCAqIDg7CiAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXNrID0gMHhGRiA8PCBzaGlmdDsKICAgICAgICAgICAgcmV0dXJuIChjb2xvciAmIG1hc2spID4+IHNoaWZ0OyAgICAgICAgICAgIAogICAgICAgIH0KICAgIAogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiaW52YWxpZCBjb2xvciBjb21wb25lbnQiKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICB1bnNpZ25lZCBpbnQgdGhlX2NvbG9yID0gMHhBQUJCQ0NGRjsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmhleCA8PCAiV2l0aCBtYWNybzpcbiIKICAgICAgICA8PCAiUjogIiA8PCBHRVRfQ09NUE9ORU5UKHRoZV9jb2xvciwgMykgPDwgJ1xuJwogICAgICAgIDw8ICJHOiAiIDw8IEdFVF9DT01QT05FTlQodGhlX2NvbG9yLCAyKSA8PCAnXG4nCiAgICAgICAgPDwgIkI6ICIgPDwgR0VUX0NPTVBPTkVOVCh0aGVfY29sb3IsIDEpIDw8ICdcbicKICAgICAgICA8PCAiQTogIiA8PCBHRVRfQ09NUE9ORU5UKHRoZV9jb2xvciwgMCkgPDwgJ1xuJzsKCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpoZXggPDwgIldpdGggZnVuY3Rpb246XG4iCiAgICAgICAgPDwgIlI6ICIgPDwgZ2V0X2NvbXBvbmVudCh0aGVfY29sb3IsIDMpIDw8ICdcbicKICAgICAgICA8PCAiRzogIiA8PCBnZXRfY29tcG9uZW50KHRoZV9jb2xvciwgMikgPDwgJ1xuJwogICAgICAgIDw8ICJCOiAiIDw8IGdldF9jb21wb25lbnQodGhlX2NvbG9yLCAxKSA8PCAnXG4nCiAgICAgICAgPDwgIkE6ICIgPDwgZ2V0X2NvbXBvbmVudCh0aGVfY29sb3IsIDApIDw8ICdcbic7CgogICAgc3RkOjpjb3V0IDw8IHN0ZDo6aGV4IDw8ICJXaXRoIGZ1bmN0aW9uOlxuIgogICAgICAgIDw8ICJSOiAiIDw8IGdldF9jb21wb25lbnQodGhlX2NvbG9yLCBSKSA8PCAnXG4nCiAgICAgICAgPDwgIkc6ICIgPDwgZ2V0X2NvbXBvbmVudCh0aGVfY29sb3IsIEcpIDw8ICdcbicKICAgICAgICA8PCAiQjogIiA8PCBnZXRfY29tcG9uZW50KHRoZV9jb2xvciwgQikgPDwgJ1xuJwogICAgICAgIDw8ICJBOiAiIDw8IGdldF9jb21wb25lbnQodGhlX2NvbG9yLCBBKSA8PCAnXG4nOwoKICAgIHJldHVybiAwOwp9Cg==