Converting decimal to binary in R?
I think that you can use R.utils package, then the intToBin() function
>library(R.utils)
>intToBin(12)
[1] "1100"
> typeof(intToBin(12))
[1] "character"
paste(rev(as.integer(intToBits(12))), collapse="")
does the job
paste
with the collapse
parameter collapses the vector into a string. You have to use rev
to get the correct byte order though.
as.integer
removes the extra zeros
intToBits
is limited to maximum 2^32, but what if we want to convert 1e10 to binary? Here is function for converting float numbers to binary, assuming as they are big integers stored as numeric
.
dec2bin <- function(fnum) {
bin_vect <- rep(0, 1 + floor(log(fnum, 2)))
while (fnum >= 2) {
pow <- floor(log(fnum, 2))
bin_vect[1 + pow] <- 1
fnum <- fnum - 2^pow
} # while
bin_vect[1] <- fnum %% 2
paste(rev(bin_vect), collapse = "")
} #dec2bin
This function begins to loose digits after 2^53 = 9.007199e15, but works fine for smaller numbers.
microbenchmark(dec2bin(1e10+111))
# Unit: microseconds
# expr min lq mean median uq max neval
# dec2bin(1e+10 + 111) 123.417 125.2335 129.0902 126.0415 126.893 285.64 100
dec2bin(9e15)
# [1] "11111111110010111001111001010111110101000000000000000"
dec2bin(9e15 + 1)
# [1] "11111111110010111001111001010111110101000000000000001"
dec2bin(9.1e15 + 1)
# [1] "100000010101000110011011011011011101001100000000000000"
Note that intToBits()
returns a 'raw' vector, not a character vector (strings). Note that my answer is a slight extension of @nico's original answer that removes the leading "0" from each bit:
paste(sapply(strsplit(paste(rev(intToBits(12))),""),`[[`,2),collapse="")
[1] "00000000000000000000000000001100"
To break down the steps, for clarity:
# bit pattern for the 32-bit integer '12'
x <- intToBits(12)
# reverse so smallest bit is first (little endian)
x <- rev(x)
# convert to character
x <- as.character(x)
# Extract only the second element (remove leading "0" from each bit)
x <- sapply(strsplit(x, "", fixed = TRUE), `[`, 2)
# Concatenate all bits into one string
x <- paste(x, collapse = "")
x
# [1] "00000000000000000000000000001100"
Or, as @nico showed, we can use as.integer()
as a more concise way to remove the leading zero from each bit.
x <- rev(intToBits(12))
x <- paste(as.integer(x), collapse = "")
# [1] "00000000000000000000000000001100"
Just for copy-paste convenience, here's a function version of the above:
dec2bin <- function(x) paste(as.integer(rev(intToBits(x))), collapse = "")