2012-10-15 11 views
16

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?

+0

welche Sprache verwenden Sie? –

+1

Welche Sprache? Dies ist eine sehr grundlegende Funktionalität und Sie können Ihre eigene Funktion dafür schreiben. – Arpit

+1

@ChandraSekharWalajapet - OP markierte die Frage [tag: r]; also denke ich, das betrifft die Sprache [R] (http://www.r-project.org/) – Marijn

Antwort

17

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" 
+0

Danke, ich denke, das ist ein schöner Weg als das, was ich schreibe ... – LifeWorks

6

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 
24

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 
+0

@LifeWorks, ich hatte die 'sttoi' Funktion vergessen; Bitte beachten Sie die Änderung. – BenBarnes

0

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 
5
base::strtoi(binary_string, base = 2)