[О блоге]
[наверх]
[пред]
[2023-02-08 12:17:18+03:00]
[c2a038efd63e836417488361fb3ab21a4a186076]
Количество цифр в десятичном числе
https://lemire.me/blog/2023/02/07/bit-hacking-with-go-code/
Я знаю формулу для узнавания количества цифр в десятичном числе:
1 + floor(log10(...))
Знаю что это медленно конечно же. Можно просто вереницей if-ов
рассчитать -- гораздо эффективнее, но более длинный код.
А в статье про игры с битами на Go увидел вот такое, отъедающее всего
несколько инструкций на современном процессоре:
func Log2Up(x uint32) int {
return 31 - bits.LeadingZeros32(x|1)
}
func DigitCount(x uint32) uint32 {
var table = []uint64{
4294967296, 8589934582, 8589934582,
8589934582, 12884901788, 12884901788,
12884901788, 17179868184, 17179868184,
17179868184, 21474826480, 21474826480,
21474826480, 21474826480, 25769703776,
25769703776, 25769703776, 30063771072,
30063771072, 30063771072, 34349738368,
34349738368, 34349738368, 34349738368,
38554705664, 38554705664, 38554705664,
41949672960, 41949672960, 41949672960,
42949672960, 42949672960}
return uint32((uint64(x) + table[Log2Up(x)]) >> 32)
}
[оставить комментарий]