Digit/Bit Representation of Integers in any Base
Integer number representations in other Bases.
Formally, for every element N =x[i]
, compute the (vector
of) “digits” A of the base
b
representation of the number N,
N = sum(k = 0:M ; A[M-k] * b^k).
Revert such a representation to integers.
digitsBase(x, base = 2, ndigits = 1 + floor(1e-9 + log(max(x,1), base))) ## S3 method for class 'basedInt' as.integer(x, ...) ## S3 method for class 'basedInt' print(x, ...) as.intBase(x, base = 2) bi2int(xlist, base)
x |
For For |
base |
integer, at least 2 specifying the base for representation. |
ndigits |
number of bits/digits to use. |
... |
potential further arguments passed to methods, notably
|
xlist |
a |
For digitsBase()
, an object, say m
, of class
"basedInt"
which is basically a (ndigits
x n
)
matrix
where m[,i]
corresponds to x[i]
,
n <- length(x)
and attr(m,"base")
is the input
base
.
as.intBase()
and the as.integer
method for
basedInt
objects return an integer
vector.
bi2int()
is the low-level workhorse of as.intBase()
.
Some of these functions existed under names digits
and
digits.v
in previous versions of the sfsmisc package.
Martin Maechler, Dec 4, 1991 (for S-plus; then called digits.v
).
digitsBase(0:12, 8) #-- octal representation empty.dimnames(digitsBase(0:33, 2)) # binary ## This may be handy for just one number (and default decimal): digits <- function(n, base = 10) as.vector(digitsBase(n, base = base)) digits(128982734) # 1 2 8 9 8 2 7 3 4 digits(128, base = 8) # 2 0 0 ## one way of pretty printing (base <= 10!) b2ch <- function(db) noquote(gsub("^0+(.{1,})$"," \\1", apply(db, 2, paste, collapse = ""))) b2ch(digitsBase(0:33, 2)) #-> 0 1 10 11 100 101 ... 100001 b2ch(digitsBase(0:33, 4)) #-> 0 1 2 3 10 11 12 13 20 ... 200 201 ## Hexadecimal: i <- c(1:20, 100:106) M <- digitsBase(i, 16) hexdig <- c(0:9, LETTERS[1:6]) cM <- hexdig[1 + M]; dim(cM) <- dim(M) b2ch(cM) #-> 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 ... 6A ## IP (Internet Protocol) numbers coding: <n>.<n>.<n>.<n> <--> longinteger ip_ntoa <- function(n) apply(digitsBase(n, base = 256), 2, paste, collapse=".") ip_ntoa(2130706430 + (0:9))# "126.255.255.254" ... "127.0.0.7" ## and the inverse: ip_aton <- function(a) bi2int(lapply(strsplit(a, ".", fixed=TRUE), as.integer), 256) n <- 2130706430 + (0:9) head(ip <- ip_ntoa(n)) head(ip_aton(ip)) stopifnot( n == ip_aton(ip_ntoa(n )), ip == ip_ntoa(ip_aton(ip))) ## Inverse of digitsBase() : as.integer method for the "basedInt" class as.integer(M) ## or also as.intBase() working from strings: (cb <- apply(digitsBase(0:33, 4), 2, paste, collapse = "")) ##-> "000" "001" ..... "200" "201" all(0:33 == as.intBase(cb, base = 4))
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.