1627f7eb2Smrg// <bit> -*- C++ -*- 2627f7eb2Smrg 3*4c3eb207Smrg// Copyright (C) 2018-2020 Free Software Foundation, Inc. 4627f7eb2Smrg// 5627f7eb2Smrg// This file is part of the GNU ISO C++ Library. This library is free 6627f7eb2Smrg// software; you can redistribute it and/or modify it under the 7627f7eb2Smrg// terms of the GNU General Public License as published by the 8627f7eb2Smrg// Free Software Foundation; either version 3, or (at your option) 9627f7eb2Smrg// any later version. 10627f7eb2Smrg 11627f7eb2Smrg// This library is distributed in the hope that it will be useful, 12627f7eb2Smrg// but WITHOUT ANY WARRANTY; without even the implied warranty of 13627f7eb2Smrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14627f7eb2Smrg// GNU General Public License for more details. 15627f7eb2Smrg 16627f7eb2Smrg// Under Section 7 of GPL version 3, you are granted additional 17627f7eb2Smrg// permissions described in the GCC Runtime Library Exception, version 18627f7eb2Smrg// 3.1, as published by the Free Software Foundation. 19627f7eb2Smrg 20627f7eb2Smrg// You should have received a copy of the GNU General Public License and 21627f7eb2Smrg// a copy of the GCC Runtime Library Exception along with this program; 22627f7eb2Smrg// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23627f7eb2Smrg// <http://www.gnu.org/licenses/>. 24627f7eb2Smrg 25627f7eb2Smrg/** @file include/bit 26627f7eb2Smrg * This is a Standard C++ Library header. 27627f7eb2Smrg */ 28627f7eb2Smrg 29627f7eb2Smrg#ifndef _GLIBCXX_BIT 30627f7eb2Smrg#define _GLIBCXX_BIT 1 31627f7eb2Smrg 32627f7eb2Smrg#pragma GCC system_header 33627f7eb2Smrg 34627f7eb2Smrg#if __cplusplus >= 201402L 35627f7eb2Smrg 36627f7eb2Smrg#include <type_traits> 37*4c3eb207Smrg 38*4c3eb207Smrg#if _GLIBCXX_HOSTED 39*4c3eb207Smrg# include <ext/numeric_traits.h> 40*4c3eb207Smrg#else 41627f7eb2Smrg# include <limits> 42*4c3eb207Smrg/// @cond undocumented 43*4c3eb207Smrgnamespace __gnu_cxx 44*4c3eb207Smrg{ 45*4c3eb207Smrg template<typename _Tp> 46*4c3eb207Smrg struct __int_traits 47*4c3eb207Smrg { 48*4c3eb207Smrg static constexpr int __digits = std::numeric_limits<_Tp>::digits; 49*4c3eb207Smrg static constexpr _Tp __max = std::numeric_limits<_Tp>::max(); 50*4c3eb207Smrg }; 51*4c3eb207Smrg} 52*4c3eb207Smrg/// @endcond 53*4c3eb207Smrg#endif 54627f7eb2Smrg 55627f7eb2Smrgnamespace std _GLIBCXX_VISIBILITY(default) 56627f7eb2Smrg{ 57627f7eb2Smrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 58627f7eb2Smrg 59*4c3eb207Smrg /** 60*4c3eb207Smrg * @defgroup bit_manip Bit manipulation 61*4c3eb207Smrg * @ingroup numerics 62*4c3eb207Smrg * 63*4c3eb207Smrg * Utilities for examining and manipulating individual bits. 64*4c3eb207Smrg * 65*4c3eb207Smrg * @{ 66*4c3eb207Smrg */ 67*4c3eb207Smrg 68*4c3eb207Smrg /// @cond undoc 69*4c3eb207Smrg 70627f7eb2Smrg template<typename _Tp> 71627f7eb2Smrg constexpr _Tp 72627f7eb2Smrg __rotl(_Tp __x, int __s) noexcept 73627f7eb2Smrg { 74*4c3eb207Smrg constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits; 75627f7eb2Smrg const int __r = __s % _Nd; 76627f7eb2Smrg if (__r == 0) 77627f7eb2Smrg return __x; 78627f7eb2Smrg else if (__r > 0) 79627f7eb2Smrg return (__x << __r) | (__x >> ((_Nd - __r) % _Nd)); 80627f7eb2Smrg else 81627f7eb2Smrg return (__x >> -__r) | (__x << ((_Nd + __r) % _Nd)); // rotr(x, -r) 82627f7eb2Smrg } 83627f7eb2Smrg 84627f7eb2Smrg template<typename _Tp> 85627f7eb2Smrg constexpr _Tp 86627f7eb2Smrg __rotr(_Tp __x, int __s) noexcept 87627f7eb2Smrg { 88*4c3eb207Smrg constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits; 89627f7eb2Smrg const int __r = __s % _Nd; 90627f7eb2Smrg if (__r == 0) 91627f7eb2Smrg return __x; 92627f7eb2Smrg else if (__r > 0) 93627f7eb2Smrg return (__x >> __r) | (__x << ((_Nd - __r) % _Nd)); 94627f7eb2Smrg else 95627f7eb2Smrg return (__x << -__r) | (__x >> ((_Nd + __r) % _Nd)); // rotl(x, -r) 96627f7eb2Smrg } 97627f7eb2Smrg 98627f7eb2Smrg template<typename _Tp> 99627f7eb2Smrg constexpr int 100627f7eb2Smrg __countl_zero(_Tp __x) noexcept 101627f7eb2Smrg { 102*4c3eb207Smrg using __gnu_cxx::__int_traits; 103*4c3eb207Smrg constexpr auto _Nd = __int_traits<_Tp>::__digits; 104627f7eb2Smrg 105627f7eb2Smrg if (__x == 0) 106627f7eb2Smrg return _Nd; 107627f7eb2Smrg 108*4c3eb207Smrg constexpr auto _Nd_ull = __int_traits<unsigned long long>::__digits; 109*4c3eb207Smrg constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits; 110*4c3eb207Smrg constexpr auto _Nd_u = __int_traits<unsigned>::__digits; 111627f7eb2Smrg 112627f7eb2Smrg if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u) 113627f7eb2Smrg { 114627f7eb2Smrg constexpr int __diff = _Nd_u - _Nd; 115627f7eb2Smrg return __builtin_clz(__x) - __diff; 116627f7eb2Smrg } 117627f7eb2Smrg else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul) 118627f7eb2Smrg { 119627f7eb2Smrg constexpr int __diff = _Nd_ul - _Nd; 120627f7eb2Smrg return __builtin_clzl(__x) - __diff; 121627f7eb2Smrg } 122627f7eb2Smrg else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull) 123627f7eb2Smrg { 124627f7eb2Smrg constexpr int __diff = _Nd_ull - _Nd; 125627f7eb2Smrg return __builtin_clzll(__x) - __diff; 126627f7eb2Smrg } 127627f7eb2Smrg else // (_Nd > _Nd_ull) 128627f7eb2Smrg { 129627f7eb2Smrg static_assert(_Nd <= (2 * _Nd_ull), 130627f7eb2Smrg "Maximum supported integer size is 128-bit"); 131627f7eb2Smrg 132627f7eb2Smrg unsigned long long __high = __x >> _Nd_ull; 133627f7eb2Smrg if (__high != 0) 134627f7eb2Smrg { 135627f7eb2Smrg constexpr int __diff = (2 * _Nd_ull) - _Nd; 136627f7eb2Smrg return __builtin_clzll(__high) - __diff; 137627f7eb2Smrg } 138*4c3eb207Smrg constexpr auto __max_ull = __int_traits<unsigned long long>::__max; 139627f7eb2Smrg unsigned long long __low = __x & __max_ull; 140627f7eb2Smrg return (_Nd - _Nd_ull) + __builtin_clzll(__low); 141627f7eb2Smrg } 142627f7eb2Smrg } 143627f7eb2Smrg 144627f7eb2Smrg template<typename _Tp> 145627f7eb2Smrg constexpr int 146627f7eb2Smrg __countl_one(_Tp __x) noexcept 147627f7eb2Smrg { 148627f7eb2Smrg return std::__countl_zero<_Tp>((_Tp)~__x); 149627f7eb2Smrg } 150627f7eb2Smrg 151627f7eb2Smrg template<typename _Tp> 152627f7eb2Smrg constexpr int 153627f7eb2Smrg __countr_zero(_Tp __x) noexcept 154627f7eb2Smrg { 155*4c3eb207Smrg using __gnu_cxx::__int_traits; 156*4c3eb207Smrg constexpr auto _Nd = __int_traits<_Tp>::__digits; 157627f7eb2Smrg 158627f7eb2Smrg if (__x == 0) 159627f7eb2Smrg return _Nd; 160627f7eb2Smrg 161*4c3eb207Smrg constexpr auto _Nd_ull = __int_traits<unsigned long long>::__digits; 162*4c3eb207Smrg constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits; 163*4c3eb207Smrg constexpr auto _Nd_u = __int_traits<unsigned>::__digits; 164627f7eb2Smrg 165627f7eb2Smrg if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u) 166627f7eb2Smrg return __builtin_ctz(__x); 167627f7eb2Smrg else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul) 168627f7eb2Smrg return __builtin_ctzl(__x); 169627f7eb2Smrg else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull) 170627f7eb2Smrg return __builtin_ctzll(__x); 171627f7eb2Smrg else // (_Nd > _Nd_ull) 172627f7eb2Smrg { 173627f7eb2Smrg static_assert(_Nd <= (2 * _Nd_ull), 174627f7eb2Smrg "Maximum supported integer size is 128-bit"); 175627f7eb2Smrg 176*4c3eb207Smrg constexpr auto __max_ull = __int_traits<unsigned long long>::__max; 177627f7eb2Smrg unsigned long long __low = __x & __max_ull; 178627f7eb2Smrg if (__low != 0) 179627f7eb2Smrg return __builtin_ctzll(__low); 180627f7eb2Smrg unsigned long long __high = __x >> _Nd_ull; 181627f7eb2Smrg return __builtin_ctzll(__high) + _Nd_ull; 182627f7eb2Smrg } 183627f7eb2Smrg } 184627f7eb2Smrg 185627f7eb2Smrg template<typename _Tp> 186627f7eb2Smrg constexpr int 187627f7eb2Smrg __countr_one(_Tp __x) noexcept 188627f7eb2Smrg { 189627f7eb2Smrg return std::__countr_zero((_Tp)~__x); 190627f7eb2Smrg } 191627f7eb2Smrg 192627f7eb2Smrg template<typename _Tp> 193627f7eb2Smrg constexpr int 194627f7eb2Smrg __popcount(_Tp __x) noexcept 195627f7eb2Smrg { 196*4c3eb207Smrg using __gnu_cxx::__int_traits; 197*4c3eb207Smrg constexpr auto _Nd = __int_traits<_Tp>::__digits; 198627f7eb2Smrg 199*4c3eb207Smrg constexpr auto _Nd_ull = __int_traits<unsigned long long>::__digits; 200*4c3eb207Smrg constexpr auto _Nd_ul = __int_traits<unsigned long>::__digits; 201*4c3eb207Smrg constexpr auto _Nd_u = __int_traits<unsigned>::__digits; 202627f7eb2Smrg 203627f7eb2Smrg if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_u) 204627f7eb2Smrg return __builtin_popcount(__x); 205627f7eb2Smrg else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ul) 206627f7eb2Smrg return __builtin_popcountl(__x); 207627f7eb2Smrg else if _GLIBCXX17_CONSTEXPR (_Nd <= _Nd_ull) 208627f7eb2Smrg return __builtin_popcountll(__x); 209627f7eb2Smrg else // (_Nd > _Nd_ull) 210627f7eb2Smrg { 211627f7eb2Smrg static_assert(_Nd <= (2 * _Nd_ull), 212627f7eb2Smrg "Maximum supported integer size is 128-bit"); 213627f7eb2Smrg 214*4c3eb207Smrg constexpr auto __max_ull = __int_traits<unsigned long long>::__max; 215627f7eb2Smrg unsigned long long __low = __x & __max_ull; 216627f7eb2Smrg unsigned long long __high = __x >> _Nd_ull; 217627f7eb2Smrg return __builtin_popcountll(__low) + __builtin_popcountll(__high); 218627f7eb2Smrg } 219627f7eb2Smrg } 220627f7eb2Smrg 221627f7eb2Smrg template<typename _Tp> 222627f7eb2Smrg constexpr bool 223*4c3eb207Smrg __has_single_bit(_Tp __x) noexcept 224627f7eb2Smrg { return std::__popcount(__x) == 1; } 225627f7eb2Smrg 226627f7eb2Smrg template<typename _Tp> 227627f7eb2Smrg constexpr _Tp 228*4c3eb207Smrg __bit_ceil(_Tp __x) noexcept 229627f7eb2Smrg { 230*4c3eb207Smrg using __gnu_cxx::__int_traits; 231*4c3eb207Smrg constexpr auto _Nd = __int_traits<_Tp>::__digits; 232627f7eb2Smrg if (__x == 0 || __x == 1) 233627f7eb2Smrg return 1; 234627f7eb2Smrg auto __shift_exponent = _Nd - std::__countl_zero((_Tp)(__x - 1u)); 235627f7eb2Smrg // If the shift exponent equals _Nd then the correct result is not 236627f7eb2Smrg // representable as a value of _Tp, and so the result is undefined. 237627f7eb2Smrg // Want that undefined behaviour to be detected in constant expressions, 238627f7eb2Smrg // by UBSan, and by debug assertions. 239627f7eb2Smrg#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED 240627f7eb2Smrg if (!__builtin_is_constant_evaluated()) 241*4c3eb207Smrg { 242*4c3eb207Smrg __glibcxx_assert( __shift_exponent != __int_traits<_Tp>::__digits ); 243*4c3eb207Smrg } 244627f7eb2Smrg#endif 245627f7eb2Smrg using __promoted_type = decltype(__x << 1); 246627f7eb2Smrg if _GLIBCXX17_CONSTEXPR (!is_same<__promoted_type, _Tp>::value) 247627f7eb2Smrg { 248627f7eb2Smrg // If __x undergoes integral promotion then shifting by _Nd is 249627f7eb2Smrg // not undefined. In order to make the shift undefined, so that 250627f7eb2Smrg // it is diagnosed in constant expressions and by UBsan, we also 251627f7eb2Smrg // need to "promote" the shift exponent to be too large for the 252627f7eb2Smrg // promoted type. 253627f7eb2Smrg const int __extra_exp = sizeof(__promoted_type) / sizeof(_Tp) / 2; 254627f7eb2Smrg __shift_exponent |= (__shift_exponent & _Nd) << __extra_exp; 255627f7eb2Smrg } 256627f7eb2Smrg return (_Tp)1u << __shift_exponent; 257627f7eb2Smrg } 258627f7eb2Smrg 259627f7eb2Smrg template<typename _Tp> 260627f7eb2Smrg constexpr _Tp 261*4c3eb207Smrg __bit_floor(_Tp __x) noexcept 262627f7eb2Smrg { 263*4c3eb207Smrg constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits; 264627f7eb2Smrg if (__x == 0) 265627f7eb2Smrg return 0; 266627f7eb2Smrg return (_Tp)1u << (_Nd - std::__countl_zero((_Tp)(__x >> 1))); 267627f7eb2Smrg } 268627f7eb2Smrg 269627f7eb2Smrg template<typename _Tp> 270627f7eb2Smrg constexpr _Tp 271*4c3eb207Smrg __bit_width(_Tp __x) noexcept 272627f7eb2Smrg { 273*4c3eb207Smrg constexpr auto _Nd = __gnu_cxx::__int_traits<_Tp>::__digits; 274627f7eb2Smrg return _Nd - std::__countl_zero(__x); 275627f7eb2Smrg } 276627f7eb2Smrg 277*4c3eb207Smrg /// @endcond 278*4c3eb207Smrg 279627f7eb2Smrg#if __cplusplus > 201703L 280627f7eb2Smrg 281*4c3eb207Smrg#define __cpp_lib_bitops 201907L 282627f7eb2Smrg 283*4c3eb207Smrg /// @cond undoc 284627f7eb2Smrg template<typename _Tp, typename _Up = _Tp> 285627f7eb2Smrg using _If_is_unsigned_integer 286*4c3eb207Smrg = enable_if_t<__is_unsigned_integer<_Tp>::value, _Up>; 287*4c3eb207Smrg /// @endcond 288627f7eb2Smrg 289627f7eb2Smrg // [bit.rot], rotating 290627f7eb2Smrg 291*4c3eb207Smrg /// Rotate `x` to the left by `s` bits. 292627f7eb2Smrg template<typename _Tp> 293627f7eb2Smrg [[nodiscard]] constexpr _If_is_unsigned_integer<_Tp> 294627f7eb2Smrg rotl(_Tp __x, int __s) noexcept 295627f7eb2Smrg { return std::__rotl(__x, __s); } 296627f7eb2Smrg 297*4c3eb207Smrg /// Rotate `x` to the right by `s` bits. 298627f7eb2Smrg template<typename _Tp> 299627f7eb2Smrg [[nodiscard]] constexpr _If_is_unsigned_integer<_Tp> 300627f7eb2Smrg rotr(_Tp __x, int __s) noexcept 301627f7eb2Smrg { return std::__rotr(__x, __s); } 302627f7eb2Smrg 303627f7eb2Smrg // [bit.count], counting 304627f7eb2Smrg 305*4c3eb207Smrg /// The number of contiguous zero bits, starting from the highest bit. 306627f7eb2Smrg template<typename _Tp> 307627f7eb2Smrg constexpr _If_is_unsigned_integer<_Tp, int> 308627f7eb2Smrg countl_zero(_Tp __x) noexcept 309627f7eb2Smrg { return std::__countl_zero(__x); } 310627f7eb2Smrg 311*4c3eb207Smrg /// The number of contiguous one bits, starting from the highest bit. 312627f7eb2Smrg template<typename _Tp> 313627f7eb2Smrg constexpr _If_is_unsigned_integer<_Tp, int> 314627f7eb2Smrg countl_one(_Tp __x) noexcept 315627f7eb2Smrg { return std::__countl_one(__x); } 316627f7eb2Smrg 317*4c3eb207Smrg /// The number of contiguous zero bits, starting from the lowest bit. 318627f7eb2Smrg template<typename _Tp> 319627f7eb2Smrg constexpr _If_is_unsigned_integer<_Tp, int> 320627f7eb2Smrg countr_zero(_Tp __x) noexcept 321627f7eb2Smrg { return std::__countr_zero(__x); } 322627f7eb2Smrg 323*4c3eb207Smrg /// The number of contiguous one bits, starting from the lowest bit. 324627f7eb2Smrg template<typename _Tp> 325627f7eb2Smrg constexpr _If_is_unsigned_integer<_Tp, int> 326627f7eb2Smrg countr_one(_Tp __x) noexcept 327627f7eb2Smrg { return std::__countr_one(__x); } 328627f7eb2Smrg 329*4c3eb207Smrg /// The number of bits set in `x`. 330627f7eb2Smrg template<typename _Tp> 331627f7eb2Smrg constexpr _If_is_unsigned_integer<_Tp, int> 332627f7eb2Smrg popcount(_Tp __x) noexcept 333627f7eb2Smrg { return std::__popcount(__x); } 334627f7eb2Smrg 335627f7eb2Smrg // [bit.pow.two], integral powers of 2 336627f7eb2Smrg 337*4c3eb207Smrg#define __cpp_lib_int_pow2 202002L 338*4c3eb207Smrg 339*4c3eb207Smrg /// True if `x` is a power of two, false otherwise. 340627f7eb2Smrg template<typename _Tp> 341627f7eb2Smrg constexpr _If_is_unsigned_integer<_Tp, bool> 342*4c3eb207Smrg has_single_bit(_Tp __x) noexcept 343*4c3eb207Smrg { return std::__has_single_bit(__x); } 344627f7eb2Smrg 345*4c3eb207Smrg /// The smallest power-of-two not less than `x`. 346627f7eb2Smrg template<typename _Tp> 347627f7eb2Smrg constexpr _If_is_unsigned_integer<_Tp> 348*4c3eb207Smrg bit_ceil(_Tp __x) noexcept 349*4c3eb207Smrg { return std::__bit_ceil(__x); } 350627f7eb2Smrg 351*4c3eb207Smrg /// The largest power-of-two not greater than `x`. 352627f7eb2Smrg template<typename _Tp> 353627f7eb2Smrg constexpr _If_is_unsigned_integer<_Tp> 354*4c3eb207Smrg bit_floor(_Tp __x) noexcept 355*4c3eb207Smrg { return std::__bit_floor(__x); } 356627f7eb2Smrg 357*4c3eb207Smrg /// The smallest integer greater than the base-2 logarithm of `x`. 358627f7eb2Smrg template<typename _Tp> 359627f7eb2Smrg constexpr _If_is_unsigned_integer<_Tp> 360*4c3eb207Smrg bit_width(_Tp __x) noexcept 361*4c3eb207Smrg { return std::__bit_width(__x); } 362627f7eb2Smrg 363627f7eb2Smrg#define __cpp_lib_endian 201907L 364627f7eb2Smrg 365627f7eb2Smrg /// Byte order 366627f7eb2Smrg enum class endian 367627f7eb2Smrg { 368627f7eb2Smrg little = __ORDER_LITTLE_ENDIAN__, 369627f7eb2Smrg big = __ORDER_BIG_ENDIAN__, 370627f7eb2Smrg native = __BYTE_ORDER__ 371627f7eb2Smrg }; 372627f7eb2Smrg#endif // C++2a 373627f7eb2Smrg 374*4c3eb207Smrg /// @} 375*4c3eb207Smrg 376627f7eb2Smrg_GLIBCXX_END_NAMESPACE_VERSION 377627f7eb2Smrg} // namespace std 378627f7eb2Smrg 379627f7eb2Smrg#endif // C++14 380627f7eb2Smrg#endif // _GLIBCXX_BIT 381