[О блоге] [наверх] [пред] [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)
    }

    [оставить комментарий]