digitsBase {sfsmisc} | R Documentation |
Digit/Bit Representation of Integers in any Base
Description
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.
Usage
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)
Arguments
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 |
Value
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()
.
Note
Some of these functions existed under names digits
and
digits.v
in previous versions of the sfsmisc package.
Author(s)
Martin Maechler, Dec 4, 1991 (for S-plus; then called digits.v
).
Examples
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))