#include <cstdio>    // for printf.
#include <cstddef>	// for size_t.
#include <cstdint>	// for uintptr_t.
using namespace std;

enum class align_size : int
{
	bytes2 = 1,
	bytes4 = 2,
	bytes8 = 3,
	bytes16 = 4,
	bytes32 = 5,
	bytes64 = 6,
	bytes128 = 7
};

void *alignment(void *p, align_size align)
{
	auto shift = static_cast<int>(align);
	auto mask = (1 << shift) - 1;

	auto i = reinterpret_cast<std::uintptr_t>(p);
	i = (i + mask) & ~mask;

	return reinterpret_cast<void *>(i);
}

void f(int i)
{
	auto *p = reinterpret_cast<void *>(i);
	auto *p_after = alignment(p, align_size::bytes4);

	std::printf("%p -> %p\n", p, p_after);
}

int main()
{
	for ( auto i = 0; i <= 9; i++ )
		f(i);

	getchar();
}

