La conversione stringa binaria di binario o decimale valore

C’è qualche funzione per la conversione di stringa binaria in binario o decimale valore?

Se ho una stringa binaria 000101, cosa devo fare per convertirlo in 5?

  • che linguaggio usi ?
  • Quale Lingua? Questa è una funzionalità di base e si può scrivere la propria funzione per esso..
  • OP tagged la questione r; quindi credo che questo riguarda la lingua R
  • So che potrei scrivere la mia funzione…. la cosa è, se c’è un modo più semplice per farlo, voglio conoscerla.
InformationsquelleAutor LifeWorks | 2012-10-15

 

5 Replies
  1. 19

    Ecco cosa si può provare:

    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

    Che è, è possibile inserire entrambe le stringhe (a causa di as.character()) e numerico binario valori, ma ci sono alcuni problemi con grandi numeri come binNum. A quanto ho capito anche voi volete convertire in stringa binaria numerico valori binari, ma purtroppo non c’è nessun tipo di dati almeno in base R.

    Edit: Ora BinToDec accetta anche i binari di vettori, il che potrebbe essere una soluzione per i grandi numeri. Funzione digitsBase() dal pacchetto sfsmisc restituisce un vettore:

    (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

    Infine, un’altra possibilità è il pacchetto compositions , per esempio:

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

    Si potrebbe utilizzare il packBits funzione (in base pacchetto). Tenete a mente che questa funzione richiede molto di input specifici.

    (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

    C’è anche la strtoi funzione (anche in base pacchetto):

    strtoi("00000001001100110000010110110111", base = 2)
    # [1] 20121015
    
    strtoi("000101", base = 2)
    # [1] 5
    • Avevo dimenticato il strtoi funzione; si prega di vedere la modifica.
  3. 7

    Questa funzione calcola la versione decimale con una base flessibile. La Base è uguale a 2 binari, etc. Questo dovrebbe funzionare fino a una base di 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
    • Questo potrebbe essere semplificato: se invece di carattere vettoriale come c("000101", "00000001001100110000010110110111") abbiamo solo una stringa come "00000001001100110000010110110111" quindi è possibile abbandonare sapply sopra? Che cosa è più semplificato il codice in quel caso?
  4. 0

    Nel caso In cui si dispone di binario stringa, tutte le precedenti risposte sono grandi. Spesso mi trovo in situazioni in cui voglio codificare una combinazione di binari vettori. La logica di tradurre da una combinazione di 0 e 1 per un numero intero è sempre la stessa:

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

    Dove B è una matrice, e ogni colonna è un vettore binario.

    Esempio:

    isBig <- c(0, 1, 0, 1)
    isRed <- c(0, 0, 1, 1)
    B = cbind(isBig,isRed)
    bincount(B)
    # 0 1 2 3

Lascia un commento