【问题标题】:Convert binary string to binary or decimal value将二进制字符串转换为二进制或十进制值
【发布时间】:2012-10-05 05:36:23
【问题描述】:

有没有函数可以将二进制字符串转换为二进制或十进制值?

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

【问题讨论】:

  • 哪种语言?这是一个非常基本的功能,您可以为它编写自己的功能..
  • @ChandraSekharWalajapet - OP 标记了问题r;所以我想这涉及语言R
  • 我知道我可以编写自己的函数....问题是如果有更简单的方法可以做到这一点,我想知道。

标签: r binary typeconverter valueconverter bitconverter


【解决方案1】:

您可以使用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

还有strtoi 函数(也在base 包中):

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

strtoi("000101", base = 2)
# [1] 5

【讨论】:

  • @LifeWorks,我忘记了strtoi 函数;请查看编辑。
【解决方案2】:

您可以尝试以下方法:

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

也就是说,您可以同时输入字符串(因为as.character())和数字二进制值,但是像binNum 这样的大数字存在一些问题。据我了解,您还想将二进制字符串转换为数字二进制值,但不幸的是,至少在基本 R 中没有这种数据类型。

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

(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

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

(x <- unbinary("10101010"))
[1] 170
(y <- binary(x))
[1] "10101010"

【讨论】:

    【解决方案3】:
    base::strtoi(binary_string, base = 2)
    

    【讨论】:

      【解决方案4】:

      此函数计算具有灵活基数的十进制版本。基数等于 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
      

      【讨论】:

      • 这可以简化吗:如果不是像c("000101", "00000001001100110000010110110111") 这样的字符向量,我们只有一个像"00000001001100110000010110110111" 这样的字符串,那么是否可以在上面删除sapply?在这种情况下,最简化的代码是什么?
      【解决方案5】:

      如果您有二进制 string,那么之前的所有答案都很棒。我经常发现自己处于想要对二进制向量组合进行编码的情况。从 0 和 1 的组合转换为整数的逻辑始终相同:

      bincount <- function(B, base=2) { return(B %*% base^seq(0,ncol(B)-1)) }
      

      其中B是一个矩阵,每一列都是一个二元向量。

      例子:

      isBig <- c(0, 1, 0, 1)
      isRed <- c(0, 0, 1, 1)
      B = cbind(isBig,isRed)
      bincount(B)
      # 0 1 2 3
      

      【讨论】:

        猜你喜欢
        • 2016-07-07
        • 2021-10-30
        • 2014-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-24
        • 2019-08-23
        • 1970-01-01
        相关资源
        最近更新 更多