#include <iostream>
#include <iomanip>
constexpr unsigned int transform1(unsigned int x)
{
return ((x << 8) | x);
}
constexpr unsigned int transform2(unsigned int x)
{
return (((x & 0x00f000f0) << 4) | (x & 0x000f000f));
}
constexpr unsigned int transform3(unsigned int x)
{
return ((x << 4) | x);
}
constexpr unsigned int transform(unsigned int x)
{
return transform3(transform2(transform1(x)));
}
template <unsigned int argb> struct aarrggbb_v1
{
static const unsigned int value = transform(argb);
};
template <unsigned int argb> struct aarrggbb_v2
{
static const unsigned int value =
(argb & 0xf000) * 0x11000 +
(argb & 0x0f00) * 0x01100 +
(argb & 0x00f0) * 0x00110 +
(argb & 0x000f) * 0x00011;;
};
#define EXPAND16(x) aarrggbb_v1<x + 0>::value, \
aarrggbb_v1<x + 1>::value, \
aarrggbb_v1<x + 2>::value, \
aarrggbb_v1<x + 3>::value, \
aarrggbb_v1<x + 4>::value, \
aarrggbb_v1<x + 5>::value, \
aarrggbb_v1<x + 6>::value, \
aarrggbb_v1<x + 7>::value, \
aarrggbb_v1<x + 8>::value, \
aarrggbb_v1<x + 9>::value, \
aarrggbb_v1<x + 0xa>::value, \
aarrggbb_v1<x + 0xb>::value, \
aarrggbb_v1<x + 0xc>::value, \
aarrggbb_v1<x + 0xd>::value, \
aarrggbb_v1<x + 0xe>::value, \
aarrggbb_v1<x + 0xf>::value
#define EXPAND EXPAND16(0), \
EXPAND16(0x10), \
EXPAND16(0x20), \
EXPAND16(0x30), \
EXPAND16(0x40), \
EXPAND16(0x50), \
EXPAND16(0x60), \
EXPAND16(0x70), \
EXPAND16(0x80), \
EXPAND16(0x90), \
EXPAND16(0xa0), \
EXPAND16(0xb0), \
EXPAND16(0xc0), \
EXPAND16(0xd0), \
EXPAND16(0xe0), \
EXPAND16(0xf0), \
unsigned int table[] =
{
EXPAND
};
int main()
{
for (auto n : table)
std::cout << std::hex << n << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCmNvbnN0ZXhwciB1bnNpZ25lZCBpbnQgdHJhbnNmb3JtMSh1bnNpZ25lZCBpbnQgeCkKewogIHJldHVybiAoKHggPDwgOCkgfCB4KTsKfQoKY29uc3RleHByIHVuc2lnbmVkIGludCB0cmFuc2Zvcm0yKHVuc2lnbmVkIGludCB4KQp7CiAgcmV0dXJuICgoKHggJiAweDAwZjAwMGYwKSA8PCA0KSB8ICh4ICYgMHgwMDBmMDAwZikpOwp9Cgpjb25zdGV4cHIgdW5zaWduZWQgaW50IHRyYW5zZm9ybTModW5zaWduZWQgaW50IHgpCnsKICByZXR1cm4gKCh4IDw8IDQpIHwgeCk7Cn0KCmNvbnN0ZXhwciB1bnNpZ25lZCBpbnQgdHJhbnNmb3JtKHVuc2lnbmVkIGludCB4KQp7CiAgcmV0dXJuIHRyYW5zZm9ybTModHJhbnNmb3JtMih0cmFuc2Zvcm0xKHgpKSk7Cn0KCnRlbXBsYXRlIDx1bnNpZ25lZCBpbnQgYXJnYj4gc3RydWN0IGFhcnJnZ2JiX3YxCnsKCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmFsdWUgPSB0cmFuc2Zvcm0oYXJnYik7Cn07Cgp0ZW1wbGF0ZSA8dW5zaWduZWQgaW50IGFyZ2I+IHN0cnVjdCBhYXJyZ2diYl92Mgp7CglzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZhbHVlID0KCQkoYXJnYiAmIDB4ZjAwMCkgKiAweDExMDAwICsKCQkoYXJnYiAmIDB4MGYwMCkgKiAweDAxMTAwICsKICAgICAgCShhcmdiICYgMHgwMGYwKSAqIDB4MDAxMTAgKwogICAgICAJKGFyZ2IgJiAweDAwMGYpICogMHgwMDAxMTs7Cn07CgojZGVmaW5lIEVYUEFORDE2KHgpIGFhcnJnZ2JiX3YxPHggKyAwPjo6dmFsdWUsIFwKYWFycmdnYmJfdjE8eCArIDE+Ojp2YWx1ZSwgXAphYXJyZ2diYl92MTx4ICsgMj46OnZhbHVlLCBcCmFhcnJnZ2JiX3YxPHggKyAzPjo6dmFsdWUsIFwKYWFycmdnYmJfdjE8eCArIDQ+Ojp2YWx1ZSwgXAphYXJyZ2diYl92MTx4ICsgNT46OnZhbHVlLCBcCmFhcnJnZ2JiX3YxPHggKyA2Pjo6dmFsdWUsIFwKYWFycmdnYmJfdjE8eCArIDc+Ojp2YWx1ZSwgXAphYXJyZ2diYl92MTx4ICsgOD46OnZhbHVlLCBcCmFhcnJnZ2JiX3YxPHggKyA5Pjo6dmFsdWUsIFwKYWFycmdnYmJfdjE8eCArIDB4YT46OnZhbHVlLCBcCmFhcnJnZ2JiX3YxPHggKyAweGI+Ojp2YWx1ZSwgXAphYXJyZ2diYl92MTx4ICsgMHhjPjo6dmFsdWUsIFwKYWFycmdnYmJfdjE8eCArIDB4ZD46OnZhbHVlLCBcCmFhcnJnZ2JiX3YxPHggKyAweGU+Ojp2YWx1ZSwgXAphYXJyZ2diYl92MTx4ICsgMHhmPjo6dmFsdWUKCiNkZWZpbmUgRVhQQU5EIEVYUEFORDE2KDApLCBcCkVYUEFORDE2KDB4MTApLCBcCkVYUEFORDE2KDB4MjApLCBcCkVYUEFORDE2KDB4MzApLCBcCkVYUEFORDE2KDB4NDApLCBcCkVYUEFORDE2KDB4NTApLCBcCkVYUEFORDE2KDB4NjApLCBcCkVYUEFORDE2KDB4NzApLCBcCkVYUEFORDE2KDB4ODApLCBcCkVYUEFORDE2KDB4OTApLCBcCkVYUEFORDE2KDB4YTApLCBcCkVYUEFORDE2KDB4YjApLCBcCkVYUEFORDE2KDB4YzApLCBcCkVYUEFORDE2KDB4ZDApLCBcCkVYUEFORDE2KDB4ZTApLCBcCkVYUEFORDE2KDB4ZjApLCBcCgp1bnNpZ25lZCBpbnQgdGFibGVbXSA9CnsKCUVYUEFORAkKfTsKCmludCBtYWluKCkKewoJZm9yIChhdXRvIG4gOiB0YWJsZSkKCQlzdGQ6OmNvdXQgPDwgc3RkOjpoZXggPDwgbiA8PCAnXG4nOwoKCXJldHVybiAwOwp9