From 2c714888b413c503590fd953196f7dcc2c3a32e3 Mon Sep 17 00:00:00 2001 From: Jeff Bezanson Date: Wed, 19 Dec 2018 11:48:13 -0500 Subject: [PATCH] make `ndigits` more generic (#30384) --- base/intfuncs.jl | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/base/intfuncs.jl b/base/intfuncs.jl index 0be43a37b8635..8da0845258d13 100644 --- a/base/intfuncs.jl +++ b/base/intfuncs.jl @@ -445,15 +445,18 @@ ndigits0znb(x::Unsigned, b::Integer) = ndigits0znb(-signed(fld(x, -b)), b) + (x ndigits0znb(x::Bool, b::Integer) = x % Int # The suffix "pb" stands for "positive base" -# TODO: allow b::Integer -function ndigits0zpb(x::Base.BitUnsigned, b::Int) +function ndigits0zpb(x::Integer, b::Integer) # precondition: b > 1 x == 0 && return 0 - b < 0 && return ndigits0znb(signed(x), b) - b == 2 && return sizeof(x)<<3 - leading_zeros(x) - b == 8 && return (sizeof(x)<<3 - leading_zeros(x) + 2) ÷ 3 - b == 16 && return sizeof(x)<<1 - leading_zeros(x)>>2 - b == 10 && return ndigits0z(x) + b = Int(b) + x = abs(x) + if x isa Base.BitInteger + x = unsigned(x) + b == 2 && return sizeof(x)<<3 - leading_zeros(x) + b == 8 && return (sizeof(x)<<3 - leading_zeros(x) + 2) ÷ 3 + b == 16 && return sizeof(x)<<1 - leading_zeros(x)>>2 + b == 10 && return ndigits0z(x) + end d = 0 while x > typemax(Int) @@ -471,8 +474,6 @@ function ndigits0zpb(x::Base.BitUnsigned, b::Int) return d end -ndigits0zpb(x::Base.BitSigned, b::Integer) = ndigits0zpb(unsigned(abs(x)), Int(b)) -ndigits0zpb(x::Base.BitUnsigned, b::Integer) = ndigits0zpb(x, Int(b)) ndigits0zpb(x::Bool, b::Integer) = x % Int # The suffix "0z" means that the output is 0 on input zero (cf. #16841)