2012-10-15 10 views
16

Existe-t-il une fonction pour convertir une chaîne binaire en valeur binaire ou décimale? Si j'ai une chaîne binaire 000101, que dois-je faire pour le convertir en 5?Convertir une chaîne binaire en valeur binaire ou décimale

+0

quelle langue utilisez-vous? –

+1

Quelle langue? C'est une fonctionnalité très basique et vous pouvez écrire votre propre fonction pour cela. – Arpit

+1

@ChandraSekharWalajapet - OP a tagué la question [tag: r]; donc je suppose que cela concerne la langue [R] (http://www.r-project.org/) – Marijn

Répondre

17

Voici ce que vous pouvez essayer:

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 

qui est, vous pouvez entrer les deux chaînes (en raison de as.character()) et les valeurs binaires numériques, mais il y a quelques problèmes avec un grand nombre comme binNum. Si je comprends bien, vous voulez aussi de convertir la chaîne binaire en valeurs binaires numériques, mais malheureusement il n'y a pas ce type de données au moins dans la base R.

Edit: Maintenant BinToDec accepte aussi des vecteurs binaires, ce qui pourrait être une solution pour grands nombres. Fonction digitsBase() du package sfsmisc retourne un tel vecteur:

(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 

Enfin, une autre possibilité est forfait compositions, par exemple:

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

Merci, je pense que c'est une façon plus agréable que ce que j'écris ... – LifeWorks

6

Cette fonction calcule la version décimale avec une base flexible. Base de est égal à 2 est binaire, etc. Cela devrait fonctionner jusqu'à une base de 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

Vous pouvez utiliser la fonction packBits (dans le paquet base). Gardez à l'esprit que cette fonction nécessite une entrée très spécifique.

(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 

Il y a aussi la fonction strtoi (également dans le paquet base):

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

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

@LifeWorks, j'avais oublié la fonction 'strtoi'; s'il vous plaît voir la modification. – BenBarnes

0

Dans le cas où vous avez binaire chaîne , toutes les réponses précédentes sont grands. Je me retrouve souvent dans des situations où je veux encoder une combinaison de vecteurs binaires. La logique de traduction à partir d'une combinaison de 0 et de 1 à un nombre entier est toujours le même:

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

où B est une matrice, et chaque colonne est un vecteur binaire.

Exemple:

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) 
Questions connexes