From: Sergey Matveev Date: Wed, 8 Feb 2023 09:17:18 +0000 (+0300) Subject: Количество цифр в десятичном числе X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=c2a038efd63e836417488361fb3ab21a4a186076;p=stargrave-blog.git Количество цифр в десятичном числе 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) } ---