18 requires std::unsigned_integral<T>
20 DCHECK(d !=
static_cast<T
>(-1) && d != 0 && d != 1);
21 const unsigned bits =
static_cast<unsigned>(
sizeof(
T)) * 8;
22 const T min = (
static_cast<T
>(1) << (bits - 1));
23 const bool neg = (min & d) != 0;
24 const T ad = neg ? (0 - d) : d;
25 const T t = min + (d >> (bits - 1));
26 const T anc = t - 1 - t % ad;
27 unsigned p = bits - 1;
29 T r1 = min - q1 * anc;
48 }
while (q1 < delta || (q1 == delta && r1 == 0));
50 return MagicNumbersForDivision<T>(neg ? (0 - mul) : mul, p - bits,
false);
56 static_assert(std::is_unsigned_v<T>);
58 const unsigned bits =
static_cast<unsigned>(
sizeof(
T)) * 8;
60 const T min =
static_cast<T
>(1) << (bits - 1);
61 const T max = ~static_cast<T>(0) >> 1;
62 const T nc = ones - (ones - d) % d;
64 unsigned p = bits - 1;
79 if (r2 + 1 >= d - r2) {
80 if (q2 >= max) a =
true;
84 if (q2 >= min) a =
true;
89 }
while (p < bits * 2 && (q1 < delta || (q1 == delta && r1 == 0)));
90 return MagicNumbersForDivision<T>(q2 + 1, p - bits, a);
98 MagicNumbersForDivision<uint32_t>;
100 MagicNumbersForDivision<uint64_t>;
#define EXPORT_TEMPLATE_DEFINE(export)
MagicNumbersForDivision< T > UnsignedDivisionByConstant(T d, unsigned leading_zeros)
template unsigned leading_zeros
MagicNumbersForDivision< T > SignedDivisionByConstant(T d)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)