]> Sergey Matveev's repositories - stargrave-blog.git/commitdiff
Количество цифр в десятичном числе
authorSergey Matveev <stargrave@stargrave.org>
Wed, 8 Feb 2023 09:17:18 +0000 (12:17 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 8 Feb 2023 09:17:18 +0000 (12:17 +0300)
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{
            429496729685899345828589934582,
            85899345821288490178812884901788,
            128849017881717986818417179868184,
            171798681842147482648021474826480,
            214748264802147482648025769703776,
            257697037762576970377630063771072,
            300637710723006377107234349738368,
            343497383683434973836834349738368,
            385547056643855470566438554705664,
            419496729604194967296041949672960,
            4294967296042949672960}
        return uint32((uint64(x) + table[Log2Up(x)]) >> 32)
    }


No differences found