#include <iostream>
#include <typeinfo>
#include <cstdint>
template <class T>
constexpr T pwrtwo(T exponent) {
return (T(1) << exponent);
}
template <class T>
constexpr T pwrtwo_nocast(T exponent) {
return (1 << exponent);
}
int main()
{
uint8_t u8 = 7;
uint16_t u16 = 15;
uint32_t u32 = 31;
uint64_t u64 = 63;
std::cout << "sizeof(int) is " << sizeof(int) << std::endl;
std::cout << "no cast:\n"
<< "uint8_t: " << uint64_t(pwrtwo_nocast(u8)) << "\n"
<< "uint16_t: " << pwrtwo_nocast(u16) << "\n"
<< "uint32_t: " << pwrtwo_nocast(u32) << "\n"
<< "uint64_t: " << pwrtwo_nocast(u64) << "\n\n"
<< "cast:\n"
<< "uint8_t: " << uint64_t(pwrtwo(u8)) << "\n"
<< "uint16_t: " << pwrtwo(u16) << "\n"
<< "uint32_t: " << pwrtwo(u32) << "\n"
<< "uint64_t: " << pwrtwo(u64) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxjc3RkaW50PgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNvbnN0ZXhwciBUIHB3cnR3byhUIGV4cG9uZW50KSB7CiAgcmV0dXJuIChUKDEpIDw8IGV4cG9uZW50KTsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNvbnN0ZXhwciBUIHB3cnR3b19ub2Nhc3QoVCBleHBvbmVudCkgewogIHJldHVybiAoMSA8PCBleHBvbmVudCk7Cn0KCmludCBtYWluKCkKewogIHVpbnQ4X3QgdTggPSA3OwogIHVpbnQxNl90IHUxNiA9IDE1OwogIHVpbnQzMl90IHUzMiA9IDMxOwogIHVpbnQ2NF90IHU2NCA9IDYzOwoKICBzdGQ6OmNvdXQgPDwgInNpemVvZihpbnQpIGlzICIgPDwgc2l6ZW9mKGludCkgPDwgc3RkOjplbmRsOwogIAogIHN0ZDo6Y291dCA8PCAibm8gY2FzdDpcbiIKICAgICAgICAgICAgPDwgInVpbnQ4X3Q6ICIgPDwgdWludDY0X3QocHdydHdvX25vY2FzdCh1OCkpIDw8ICJcbiIKICAgICAgICAgICAgPDwgInVpbnQxNl90OiAiIDw8IHB3cnR3b19ub2Nhc3QodTE2KSA8PCAiXG4iCiAgICAgICAgICAgIDw8ICJ1aW50MzJfdDogIiA8PCBwd3J0d29fbm9jYXN0KHUzMikgPDwgIlxuIgogICAgICAgICAgICA8PCAidWludDY0X3Q6ICIgPDwgcHdydHdvX25vY2FzdCh1NjQpIDw8ICJcblxuIgogICAgICAgICAgICA8PCAiY2FzdDpcbiIKICAgICAgICAgICAgPDwgInVpbnQ4X3Q6ICIgPDwgdWludDY0X3QocHdydHdvKHU4KSkgPDwgIlxuIgogICAgICAgICAgICA8PCAidWludDE2X3Q6ICIgPDwgcHdydHdvKHUxNikgPDwgIlxuIgogICAgICAgICAgICA8PCAidWludDMyX3Q6ICIgPDwgcHdydHdvKHUzMikgPDwgIlxuIgogICAgICAgICAgICA8PCAidWludDY0X3Q6ICIgPDwgcHdydHdvKHU2NCkgPDwgc3RkOjplbmRsOwp9Cg==