2進文字列を2進値または10進値に変換する関数はありますか?
バイナリ文字列000101
がある場合、それを5
に変換するにはどうすればよいですか?
試すことができるものは次のとおりです。
_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()
のため)と数値の2進値の両方を入力できますが、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"
_
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
base::strtoi(binary_string, base = 2)
この関数は、柔軟なベースで10進数バージョンを計算します。 2に等しいベースは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
バイナリ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