Convert binary string to binary or decimal value
Asked Answered
L

5

26

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?

Liquefy answered 15/10, 2012 at 9:4 Comment(3)
Which Language? This is a very basic functionality and you can write your own function for it..Xochitlxp
@ChandraSekharWalajapet - OP tagged the question r; so I guess this concerns the language RDudley
I know that I could write my own function.... the thing is if there is a simpler way to do it, I want to know it.Liquefy
C
45

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
Cacilia answered 15/10, 2012 at 9:59 Comment(2)
@LifeWorks, I had forgotten about the 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
E
22

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"
Expertize answered 15/10, 2012 at 9:20 Comment(0)
L
17
base::strtoi(binary_string, base = 2)
Liederkranz answered 19/6, 2016 at 1:43 Comment(0)
B
7

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
Burstone answered 15/10, 2012 at 9:25 Comment(1)
Could this be simplified: if instead of character vector like 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
P
0

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
Precaution answered 18/12, 2014 at 15:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.