/** Set max/min using bitwise operations.
*
* $ c++ -std=c++14 *.cc && ./a.out
*
*/
#include <iostream>
#include <type_traits>
namespace
{
template <typename T, bool = std::is_unsigned<T>::value> class bitwise_limits {
public:
static constexpr T max() noexcept { return T(); }
static constexpr T min() noexcept { return T(); }
};
// unsigned specialization
template <typename T>
class bitwise_limits<T, true> {
public:
static constexpr T max() noexcept { return ~T(0); } // all bits set
static constexpr T min() noexcept { return T(0); } // all bits clear
};
// signed specialization
template <typename T>
class bitwise_limits<T, false> {
public:
static constexpr T max() noexcept { // all bits set except sign
return bitwise_limits<std::make_unsigned_t<T>>::max() >> 1;
}
static constexpr T min() noexcept {
return ~max(); // all bits clear except sign
}
};
}
int main()
{
std::cout << (int)bitwise_limits<uint8_t>::max() << '\n';
std::cout << (int)bitwise_limits<uint8_t>::min() << '\n';
std::cout << (int)bitwise_limits< int8_t>::max() << '\n';
std::cout << (int)bitwise_limits< int8_t>::min() << '\n';
}
LyoqIFNldCBtYXgvbWluIHVzaW5nIGJpdHdpc2Ugb3BlcmF0aW9ucy4KICoKICogJCBjKysgLXN0ZD1jKysxNCAqLmNjICYmIC4vYS5vdXQKICoKICovCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKbmFtZXNwYWNlCnsKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9vbCA9IHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlPiAgY2xhc3MgYml0d2lzZV9saW1pdHMgewogIHB1YmxpYzoKICAgIHN0YXRpYyBjb25zdGV4cHIgVCBtYXgoKSBub2V4Y2VwdCB7IHJldHVybiBUKCk7IH0KICAgIHN0YXRpYyBjb25zdGV4cHIgVCBtaW4oKSBub2V4Y2VwdCB7IHJldHVybiBUKCk7IH0KCiAgfTsKCiAgLy8gdW5zaWduZWQgc3BlY2lhbGl6YXRpb24KICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICBjbGFzcyBiaXR3aXNlX2xpbWl0czxULCB0cnVlPiB7CiAgcHVibGljOgogICAgc3RhdGljIGNvbnN0ZXhwciBUIG1heCgpIG5vZXhjZXB0IHsgcmV0dXJuIH5UKDApOyB9ICAvLyBhbGwgYml0cyBzZXQKICAgIHN0YXRpYyBjb25zdGV4cHIgVCBtaW4oKSBub2V4Y2VwdCB7IHJldHVybiAgVCgwKTsgfSAgLy8gYWxsIGJpdHMgY2xlYXIKICB9OwoKICAvLyBzaWduZWQgc3BlY2lhbGl6YXRpb24KICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICBjbGFzcyBiaXR3aXNlX2xpbWl0czxULCBmYWxzZT4gewogIHB1YmxpYzoKICAgIHN0YXRpYyBjb25zdGV4cHIgVCBtYXgoKSBub2V4Y2VwdCB7IC8vIGFsbCBiaXRzIHNldCBleGNlcHQgc2lnbgogICAgICByZXR1cm4gYml0d2lzZV9saW1pdHM8c3RkOjptYWtlX3Vuc2lnbmVkX3Q8VD4+OjptYXgoKSA+PiAxOwogICAgfQogICAgc3RhdGljIGNvbnN0ZXhwciBUIG1pbigpIG5vZXhjZXB0IHsKICAgICAgcmV0dXJuIH5tYXgoKTsgLy8gYWxsIGJpdHMgY2xlYXIgZXhjZXB0IHNpZ24KICAgIH0KCiAgfTsKfQoKCmludCBtYWluKCkKewogIHN0ZDo6Y291dCA8PCAoaW50KWJpdHdpc2VfbGltaXRzPHVpbnQ4X3Q+OjptYXgoKSA8PCAnXG4nOwogIHN0ZDo6Y291dCA8PCAoaW50KWJpdHdpc2VfbGltaXRzPHVpbnQ4X3Q+OjptaW4oKSA8PCAnXG4nOwogIHN0ZDo6Y291dCA8PCAoaW50KWJpdHdpc2VfbGltaXRzPCBpbnQ4X3Q+OjptYXgoKSA8PCAnXG4nOwogIHN0ZDo6Y291dCA8PCAoaW50KWJpdHdpc2VfbGltaXRzPCBpbnQ4X3Q+OjptaW4oKSA8PCAnXG4nOwp9Cg==