Hardcode -'0' subtraction.
This commit is contained in:
parent
5953ea7cb5
commit
f8c0bc3d1c
1 changed files with 15 additions and 8 deletions
|
@ -133,25 +133,32 @@ namespace dhandy {
|
||||||
using RetType = ReversedSizedArray<std::decay_t<decltype(std::declval<Tr>().to_digit(1))>, implem::int_info<I, 10>::max_len + 1>;
|
using RetType = ReversedSizedArray<std::decay_t<decltype(std::declval<Tr>().to_digit(1))>, implem::int_info<I, 10>::max_len + 1>;
|
||||||
using Num = implem::NumberAdaptation<I, 10>;
|
using Num = implem::NumberAdaptation<I, 10>;
|
||||||
|
|
||||||
const constexpr char lookup[201] = "000102030405060708091011121314"
|
const constexpr char lookup[200] = {
|
||||||
"1516171819202122232425262728293031323334353637383940414243"
|
0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,1,0,1,1,1,2,1,3,1,4,
|
||||||
"4445464748495051525354555657585960616263646566676869707172"
|
1,5,1,6,1,7,1,8,1,9,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,
|
||||||
"737475767778798081828384858687888990919293949596979899";
|
3,0,3,1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,4,0,4,1,4,2,4,3,4,4,
|
||||||
|
4,5,4,6,4,7,4,8,4,9,5,0,5,1,5,2,5,3,5,4,5,5,5,6,5,7,5,8,5,9,
|
||||||
|
6,0,6,1,6,2,6,3,6,4,6,5,6,6,6,7,6,8,6,9,7,0,7,1,7,2,7,3,7,4,
|
||||||
|
7,5,7,6,7,7,7,8,7,9,8,0,8,1,8,2,8,3,8,4,8,5,8,6,8,7,8,8,8,9,
|
||||||
|
9,0,9,1,9,2,9,3,9,4,9,5,9,6,9,7,9,8,9,9
|
||||||
|
};
|
||||||
const bool was_negative = implem::is_negative<I, 10>(in);
|
const bool was_negative = implem::is_negative<I, 10>(in);
|
||||||
|
|
||||||
RetType arr;
|
RetType arr;
|
||||||
arr.push_front('\0');
|
arr.push_front('\0');
|
||||||
while (Num::abs(in) >= static_cast<I>(100)) {
|
while (Num::abs(in) >= static_cast<I>(100)) {
|
||||||
arr.push_front(Tr::to_digit(static_cast<int>(lookup[(Num::abs(in) % 100) * 2 + 1] - '0')));
|
const auto index = (Num::abs(in) % 100) * 2;
|
||||||
arr.push_front(Tr::to_digit(static_cast<int>(lookup[(Num::abs(in) % 100) * 2 + 0] - '0')));
|
arr.push_front(Tr::to_digit(static_cast<int>(lookup[index + 1])));
|
||||||
|
arr.push_front(Tr::to_digit(static_cast<int>(lookup[index + 0])));
|
||||||
in = static_cast<I>(in / static_cast<I>(100));
|
in = static_cast<I>(in / static_cast<I>(100));
|
||||||
};
|
};
|
||||||
if (Num::abs(in) < static_cast<I>(10)) {
|
if (Num::abs(in) < static_cast<I>(10)) {
|
||||||
arr.push_front(Tr::to_digit(static_cast<int>(Num::abs(in))));
|
arr.push_front(Tr::to_digit(static_cast<int>(Num::abs(in))));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
arr.push_front(Tr::to_digit(static_cast<int>(lookup[Num::abs(in) * 2 + 1] - '0')));
|
const auto index = Num::abs(in) * 2;
|
||||||
arr.push_front(Tr::to_digit(static_cast<int>(lookup[Num::abs(in) * 2 + 0] - '0')));
|
arr.push_front(Tr::to_digit(static_cast<int>(lookup[index + 1])));
|
||||||
|
arr.push_front(Tr::to_digit(static_cast<int>(lookup[index + 0])));
|
||||||
}
|
}
|
||||||
if (was_negative)
|
if (was_negative)
|
||||||
arr.push_front(Tr::Minus);
|
arr.push_front(Tr::Minus);
|
||||||
|
|
Loading…
Reference in a new issue