将二进制字符串转换为二进制或十进制值

Lif*_*rks 20 binary r typeconverter valueconverter bitconverter

是否有任何函数将二进制字符串转换为二进制或十进制值?

如果我有一个二进制字符串000101,我应该怎么做才能将它转换成5

Ben*_*nes 29

您可以使用该packBits功能(在base包中).请记住,此功能需要非常具体的输入.

(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
Run Code Online (Sandbox Code Playgroud)

还有strtoi功能(也在base包中):

strtoi("00000001001100110000010110110111", base = 2)
# [1] 20121015

strtoi("000101", base = 2)
# [1] 5
Run Code Online (Sandbox Code Playgroud)


Jul*_*ora 19

您可以尝试以下方法:

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
Run Code Online (Sandbox Code Playgroud)

也就是说,您可以输入两个字符串(因为as.character())和数字二进制值,但是大数字存在一些问题binNum.据我所知,你也想将二进制字符串转换为数字二进制值,但不幸的是,至少在基数R中没有这样的数据类型.

编辑:现在BinToDec也接受二进制向量,这可能是大数字的解决方案.digitsBase()包中的函数sfsmisc返回这样一个向量:

(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
Run Code Online (Sandbox Code Playgroud)

最后,另一种可能性是包compositions,例如:

(x <- unbinary("10101010"))
[1] 170
(y <- binary(x))
[1] "10101010"
Run Code Online (Sandbox Code Playgroud)


小智 10

base::strtoi(binary_string, base = 2)
Run Code Online (Sandbox Code Playgroud)


Pau*_*tra 7

此函数使用灵活的基础计算十进制版本.基数等于2是二进制等.这应该工作直到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
Run Code Online (Sandbox Code Playgroud)