Convert binary string to binary or decimal value

前端 未结 5 1678
死守一世寂寞
死守一世寂寞 2020-12-01 05: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条回答
  • 2020-12-01 06:04

    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
    
    0 讨论(0)
  • 2020-12-01 06:16

    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"
    
    0 讨论(0)
  • 2020-12-01 06:16

    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
    
    0 讨论(0)
  • 2020-12-01 06:23

    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
    
    0 讨论(0)
  • 2020-12-01 06:26
    base::strtoi(binary_string, base = 2)
    
    0 讨论(0)
提交回复
热议问题