Преобразование двоичной строки в двоичное или десятичное значение - программирование
Подтвердить что ты не робот

Преобразование двоичной строки в двоичное или десятичное значение

Есть ли какая-либо функция для преобразования двоичной строки в двоичное или десятичное значение?

Если у меня есть двоичная строка 000101, что мне делать, чтобы преобразовать ее в 5?

4b9b3361

Ответ 1

Вот что вы можете попробовать:

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 также принимает двоичные векторы, которые могут быть решением для больших чисел. Функция 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

Наконец, еще одна возможность - пакет compositions, например:

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

Ответ 2

Вы можете использовать функцию 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

Ответ 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

Ответ 5

В случае, если у вас есть двоичная строка, все предыдущие ответы велики. Я часто оказываюсь в ситуациях, когда хочу кодировать комбинацию двоичных векторов. Логика перевода из комбинации 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