For base 2/16 this is pretty easy if you use assembly, because most ISAs have instructions to count the leading zeros, so for eg. aarch64 to get length of hex integer (assuming you're not trying to do anything weird like signed hex - negative numbers will always be max width this way):
hlen:
// int hlen(uint64_t x)
// takes an integer, returns length of hex string
mov x9, #16 // max width
clz x0, x0 // count binary leading zeros
cmp x0, #64
lsr x0, x0, #2 // 4 bits per hex digit
sub x0, x9, x0
cinc x0, x0, eq // if num = 0, add 1
ret
Decimal requires looping (well, only ~20 comparisons needed for 64-bit so maybe that could be unrolled but same thing either way), so it's simpler to just use high level.