From c2a038efd63e836417488361fb3ab21a4a186076 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Wed, 8 Feb 2023 12:17:18 +0300 Subject: [PATCH] =?utf8?q?=D0=9A=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81=D1=82?= =?utf8?q?=D0=B2=D0=BE=20=D1=86=D0=B8=D1=84=D1=80=20=D0=B2=20=D0=B4=D0=B5?= =?utf8?q?=D1=81=D1=8F=D1=82=D0=B8=D1=87=D0=BD=D0=BE=D0=BC=20=D1=87=D0=B8?= =?utf8?q?=D1=81=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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) } -- 2.48.1