// Test for boost/core/bit.hpp (bit_width) // // Copyright 2020 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include template void test_width( T x ) { BOOST_TEST_EQ( boost::core::bit_width( x ), std::numeric_limits::digits - boost::core::countl_zero( x ) ); } int main() { { boost::uint8_t x = 0; BOOST_TEST_EQ( boost::core::bit_width( x ), 0 ); x = 1; for( int i = 0; i < 8; ++i, x <<= 1 ) { BOOST_TEST_EQ( boost::core::bit_width( x ), i+1 ); BOOST_TEST_EQ( boost::core::bit_width( static_cast( x | ( x >> 1 ) ) ), i+1 ); BOOST_TEST_EQ( boost::core::bit_width( static_cast( x | ( x >> 2 ) ) ), i+1 ); } } { boost::uint16_t x = 0; BOOST_TEST_EQ( boost::core::bit_width( x ), 0 ); x = 1; for( int i = 0; i < 16; ++i, x <<= 1 ) { BOOST_TEST_EQ( boost::core::bit_width( x ), i+1 ); BOOST_TEST_EQ( boost::core::bit_width( static_cast( x | ( x >> 1 ) ) ), i+1 ); BOOST_TEST_EQ( boost::core::bit_width( static_cast( x | ( x >> 2 ) ) ), i+1 ); } } { boost::uint32_t x = 0; BOOST_TEST_EQ( boost::core::bit_width( x ), 0 ); x = 1; for( int i = 0; i < 32; ++i, x <<= 1 ) { BOOST_TEST_EQ( boost::core::bit_width( x ), i+1 ); BOOST_TEST_EQ( boost::core::bit_width( static_cast( x | ( x >> 1 ) ) ), i+1 ); BOOST_TEST_EQ( boost::core::bit_width( static_cast( x | ( x >> 2 ) ) ), i+1 ); } } { boost::uint64_t x = 0; BOOST_TEST_EQ( boost::core::bit_width( x ), 0 ); x = 1; for( int i = 0; i < 64; ++i, x <<= 1 ) { BOOST_TEST_EQ( boost::core::bit_width( x ), i+1 ); BOOST_TEST_EQ( boost::core::bit_width( static_cast( x | ( x >> 1 ) ) ), i+1 ); BOOST_TEST_EQ( boost::core::bit_width( static_cast( x | ( x >> 2 ) ) ), i+1 ); } } boost::detail::splitmix64 rng; for( int i = 0; i < 1000; ++i ) { boost::uint64_t x = rng(); test_width( static_cast( x ) ); test_width( static_cast( x ) ); test_width( static_cast( x ) ); test_width( static_cast( x ) ); test_width( static_cast( x ) ); } return boost::report_errors(); }