sfsmisc (version 1.1-4)

digitsBase: 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 basedInt
as.integer(x, …)
# S3 method for basedInt
print(x, …)

as.intBase(x, base = 2) bi2int(xlist, base)

Arguments

x

For digitsBase(): non-negative integer (vector) whose base base digits are wanted.

For as.intBase(): a list of numeric vectors, a character vector, or an integer matrix as returned by digitsBase(), representing digits in base base.

base

integer, at least 2 specifying the base for representation.

ndigits

number of bits/digits to use.

potential further arguments passed to methods, notably print.

xlist

a list of integer vectors with entries typically in 0:(base-1), such as resulting from digitsBase().

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().

Examples

Run this code
# NOT RUN {
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", 
# }
# NOT RUN {
<!-- % \\\\  |--> \\ in example R core -->
# }
# NOT RUN {
                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))
# }

Run the code above in your browser using DataCamp Workspace