Is there any function to convert binary string into binary or decimal value?
If I have a binary string 000101
, what should I do to convert it into 5
?
Is there any function to convert binary string into binary or decimal value?
If I have a binary string 000101
, what should I do to convert it into 5
?
You could use the packBits
function (in the base
package). Bear in mind that this function requires very specific input.
(yy <- intToBits(5))
# [1] 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
# [26] 00 00 00 00 00 00 00
# Note that there are 32 bits and the order is reversed from your example
class(yy)
[1] "raw"
packBits(yy, "integer")
# [1] 5
There is also the strtoi
function (also in the base
package):
strtoi("00000001001100110000010110110111", base = 2)
# [1] 20121015
strtoi("000101", base = 2)
# [1] 5
strtoi
function; please see the edit. –
Cacilia strtoi
can only convert binaries up to a decimal value of 2147483647 as its output is an integer and this is is the maximum integer value allowed by R (see .Machine$integer.max
). In most cases, this limit should be largely sufficient. In some cases, such as converting bit64 numbers to decimal, you will run into problems. In that case Julius Vainora's answer does the trick as the output will be of type numeric. –
Adalie Here is what you can try:
binStr <- "00000001001100110000010110110111" # 20121015
(binNum <- 00000001001100110000010110110111) # 20121015
[1] 1.0011e+24
binVec <- c(1,0,1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1) # 2670721
shortBin <- 10011010010 # 1234
BinToDec <- function(x)
sum(2^(which(rev(unlist(strsplit(as.character(x), "")) == 1))-1))
BinToDec(binStr)
[1] 20121015
BinToDec(binNum)
[1] 576528
BinToDec(binVec)
[1] 2670721
BinToDec(shortBin)
[1] 1234
That is, you can input both strings (because of as.character()
) and numeric binary values but there are some problems with large numbers like binNum
. As I understand you also want to convert binary string to numeric binary values, but unfortunately there is no such data type at least in base R.
Edit: Now BinToDec
also accepts binary vectors, which might be a solution for large numbers. Function digitsBase()
from package sfsmisc
returns such a vector:
(vec <- digitsBase(5, base= 2, 10))
Class 'basedInt'(base = 2) [1:1]
[,1]
[1,] 0
[2,] 0
[3,] 0
[4,] 0
[5,] 0
[6,] 0
[7,] 0
[8,] 1
[9,] 0
[10,] 1
BinToDec(vec)
[1] 5
Finally, another possibility is package compositions
, for example:
(x <- unbinary("10101010"))
[1] 170
(y <- binary(x))
[1] "10101010"
This function calculates the decimal version with a flexible base. Base equals 2 is binary, etc. This should work up until a base of 10.
base2decimal = function(base_number, base = 2) {
split_base = strsplit(as.character(base_number), split = "")
return(sapply(split_base, function(x) sum(as.numeric(x) * base^(rev(seq_along(x) - 1)))))
}
> base2decimal(c("000101", "00000001001100110000010110110111"))
[1] 5 20121015
c("000101", "00000001001100110000010110110111")
we have just one string like "00000001001100110000010110110111"
then is it possible to drop sapply
above? What is the most simplified code in that case? –
Checkerboard In the case that you have binary string, all of the prior answers are great. I often find myself in situations where I want to encode a combination of binary vectors. The logic of translating from a combination of 0's and 1's to an integer is always the same:
bincount <- function(B, base=2) { return(B %*% base^seq(0,ncol(B)-1)) }
Where B is a matrix, and each column is a binary vector.
Example:
isBig <- c(0, 1, 0, 1)
isRed <- c(0, 0, 1, 1)
B = cbind(isBig,isRed)
bincount(B)
# 0 1 2 3
© 2022 - 2024 — McMap. All rights reserved.