25

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?

zx8754
  • 52,746
  • 12
  • 114
  • 209
LifeWorks
  • 396
  • 1
  • 4
  • 12
  • 1
    Which Language? This is a very basic functionality and you can write your own function for it.. – Arpit Oct 15 '12 at 09:07
  • 1
    @ChandraSekharWalajapet - OP tagged the question [tag:r]; so I guess this concerns the language [R](http://www.r-project.org/) – Marijn Oct 15 '12 at 09:12
  • 2
    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. – LifeWorks Oct 15 '12 at 10:00

5 Answers5

42

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
BenBarnes
  • 19,114
  • 6
  • 56
  • 74
21

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"
Julius Vainora
  • 47,421
  • 9
  • 90
  • 102
17
base::strtoi(binary_string, base = 2)
J_F
  • 9,956
  • 2
  • 31
  • 55
Justin Howe
  • 171
  • 1
  • 3
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
Paul Hiemstra
  • 59,984
  • 12
  • 142
  • 149
  • 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? – Erdogan CEVHER May 27 '19 at 06:49
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
Chris Cox
  • 390
  • 3
  • 14