Gibt es eine Funktion zum Konvertieren von Binärzeichenfolgen in Binär- oder Dezimalwerte?Binär-String in Binär- oder Dezimalwert umwandeln
Wenn ich eine binäre Zeichenfolge 000101
habe, was soll ich tun, um es in 5
zu konvertieren?
Gibt es eine Funktion zum Konvertieren von Binärzeichenfolgen in Binär- oder Dezimalwerte?Binär-String in Binär- oder Dezimalwert umwandeln
Wenn ich eine binäre Zeichenfolge 000101
habe, was soll ich tun, um es in 5
zu konvertieren?
Hier ist, was Sie versuchen können:
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
Das heißt, die Sie eingeben können beide Strings (wegen as.character()
) und numerische binäre Werte, aber es gibt einige Probleme mit einer großen Zahl wie binNum
. Wie ich verstehe Sie wollen auch binäre Zeichenfolge in numerische binäre Werte konvertieren, aber leider gibt es keine solche Datentyp zumindest in Grund R.
Edit: Jetzt BinToDec
akzeptiert auch binäre Vektoren, die eine Lösung sein könnte für große Zahlen. Funktion digitsBase()
von Paket sfsmisc
einen Vektor, zurückgibt:
(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
Schließlich ist eine weitere Möglichkeit Paket compositions
, zum Beispiel:
(x <- unbinary("10101010"))
[1] 170
(y <- binary(x))
[1] "10101010"
Danke, ich denke, das ist ein schöner Weg als das, was ich schreibe ... – LifeWorks
Diese Funktion berechnet die Dezimal-Version mit einer flexiblen Basis. Basis gleich 2 ist binär, usw. Diese 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
bis eine Basis arbeiten sollten Sie die packBits
Funktion (im base
Paket) nutzen könnten. Beachten Sie, dass diese Funktion sehr spezifische Eingaben erfordert.
(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
Es gibt auch die strtoi
Funktion (auch im base
Paket):
strtoi("00000001001100110000010110110111", base = 2)
# [1] 20121015
strtoi("000101", base = 2)
# [1] 5
@LifeWorks, ich hatte die 'sttoi' Funktion vergessen; Bitte beachten Sie die Änderung. – BenBarnes
Im Fall, dass Sie binär String haben, alle vorherigen Antworten sind groß. Ich bin oft in Situationen, in denen ich eine Kombination binärer Vektoren kodieren möchte. Die Logik des aus einer Kombination von 0 und 1 ist auf eine ganze Zahl zu übersetzen ist immer das gleiche:
bincount <- function(B, base=2) { return(B %*% base^seq(0,ncol(B)-1)) }
wobei B eine Matrix ist, und jede Spalte ist ein binärer Vektor ist.
Beispiel:
isBig <- c(0, 1, 0, 1)
isRed <- c(0, 0, 1, 1)
B = cbind(isBig,isRed)
bincount(B)
# 0 1 2 3
base::strtoi(binary_string, base = 2)
welche Sprache verwenden Sie? –
Welche Sprache? Dies ist eine sehr grundlegende Funktionalität und Sie können Ihre eigene Funktion dafür schreiben. – Arpit
@ChandraSekharWalajapet - OP markierte die Frage [tag: r]; also denke ich, das betrifft die Sprache [R] (http://www.r-project.org/) – Marijn