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)
}