#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;
}