2012-08-23 17 views
16

Come convertire un numero intero in vettore binario utilizzando R?Come convertire il numero intero nel vettore binario?

Ad esempio:

number <- 11 
[1] 1 0 1 1 

qual è il metodo più veloce possibile di conversione (utilizzando il codice R o alcune funzioni esistenti da pacchetti) se necessario convertire intero vettore di numeri (valore minimo = 0, massimo = 300) nella matrice binaria?

risposta

19

c'è la funzione di intToBits che converte qualsiasi numero intero a un vettore di 32 raws, quindi si può fare questo:

decimals <- c(3,5,11,4) 
m <- sapply(decimals,function(x){ as.integer(intToBits(x))}) 
m 

> m 
     [,1] [,2] [,3] [,4] 
[1,] 1 1 1 0 
[2,] 1 0 1 0 
[3,] 0 1 0 1 
[4,] 0 0 1 0 
[5,] 0 0 0 0 
[6,] 0 0 0 0 
[7,] 0 0 0 0 
[8,] 0 0 0 0 
[9,] 0 0 0 0 
[10,] 0 0 0 0 
[11,] 0 0 0 0 
[12,] 0 0 0 0 
[13,] 0 0 0 0 
[14,] 0 0 0 0 
[15,] 0 0 0 0 
[16,] 0 0 0 0 
[17,] 0 0 0 0 
[18,] 0 0 0 0 
[19,] 0 0 0 0 
[20,] 0 0 0 0 
[21,] 0 0 0 0 
[22,] 0 0 0 0 
[23,] 0 0 0 0 
[24,] 0 0 0 0 
[25,] 0 0 0 0 
[26,] 0 0 0 0 
[27,] 0 0 0 0 
[28,] 0 0 0 0 
[29,] 0 0 0 0 
[30,] 0 0 0 0 
[31,] 0 0 0 0 
[32,] 0 0 0 0 
+0

non dovrebbe la 3a riga essere 1011? – nikpod

+0

@nikpod Volete il rovescio della 3a colonna, che è '0000 ... 00001011' – digEmAll

+0

il mio male, lo stavo guardando in fila. I numeri 5 e 4 sono rappresentati ugualmente in righe – nikpod

17

Questa SO post suggerisce la funzione intToBits. Definisco la funzione number2binary, che include un argomento noBits per controllare il numero di bit restituito. Lo standard è di restituire 32 bit.

number2binary = function(number, noBits) { 
     binary_vector = rev(as.numeric(intToBits(number))) 
     if(missing(noBits)) { 
      return(binary_vector) 
     } else { 
      binary_vector[-(1:(length(binary_vector) - noBits))] 
     } 
    } 

E per alcuni esempi:

> number2binary(11) 
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 
> number2binary(11, 4) 
[1] 1 0 1 1 
+0

ottengo 'lunghezza (number2binary (0, 32)) == 31' ...? –

5

si potrebbe usare la seguente funzione per questo, sulla base di intToBit:

intToBitVect <- function(x){ 
    tmp <- rev(as.numeric(intToBits(x))) 
    id <- seq_len(match(1,tmp,length(tmp))-1) 
    tmp[-id] 
} 

La prima riga converte l'uscita intToBits ad un numerico 0 e 1, e mette rettilineo ordine. La seconda riga controlla quali valori devono essere mantenuti, come segue:

  • controllare dove si verifica il primo 1 utilizzando match. Se non c'è 1 da trovare, si chiede match per restituire la lunghezza del vostro tmp vettore.
  • creare una sequenza (usando seq_len) dal 1 alla posizione precedente alla prima occorrenza di 1 nel tmp vettore
  • cadere tutte quelle posizioni nel tmp vettore

Per vederlo così:

> intToBitVect(11) 
[1] 1 0 1 1 
> intToBitVect(0) 
[1] 0 
7

Una soluzione che ho trovato in "The R Book" di MJ Crawley è la seguente funzione:

binary <- function(x) { 
    i <- 0 
    string <- numeric(32) 
    while(x > 0) { 
    string[32 - i] <- x %% 2 
    x <- x %/% 2 
    i <- i + 1 
    } 
    first <- match(1, string) 
    string[first:32] 
} 
+0

Questa funzione è fantastica !!! È di gran lunga la soluzione più generale .. Complimenti !! –

2

Se si desidera restituire una sequenza binaria, cioè un vettore di 1 e 0, allora questa funzione lo farà per voi, ma si può solo prendere 1 numero alla volta.

dectobin <- function(y) { 
    # find the binary sequence corresponding to the decimal number 'y' 
    stopifnot(length(y) == 1, mode(y) == 'numeric') 
    q1 <- (y/2) %/% 1 
    r <- y - q1 * 2 
    res = c(r) 
    while (q1 >= 1) { 
    q2 <- (q1/2) %/% 1 
    r <- q1 - q2 * 2 
    q1 <- q2 
    res = c(r, res) 
    } 
    return(res) 
} 
1

E un altro:

toBits <- function (x, nBits = 8){ 
    tail(rev(as.numeric(intToBits(x))),nBits) 
} 
0
intToBin <- function(x){ 
    if (x == 1) 
    1 
    else if (x == 0) 
    NULL 
    else { 
    mod <- x %% 2 
    c(intToBin((x-mod) %/% 2), mod) 
    } 
} 

Così intToBin (10) restituisce

[1] "1" "0" "1" "0" 

E se volete stringa invece di vettore

> paste0(intToBin(10), collapse = "") 
[1] "1010" 
2

Prova il pacchetto CRAN "binaryLogic"

library(binaryLogic) 

as.binary(11) 
[1] 1 0 1 1 

as.binary(11, littleEndian=TRUE) 
[1] 1 1 0 1 

as.binary(42, n=16) 
[1] 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 

as.binary(0:2, n=2) 
[[1]] 
[1] 0 0 

[[2]] 
[1] 0 1 

[[3]] 
[1] 1 0 

as.binary(0xFF) 
[1] 1 1 1 1 1 1 1 1 

Disponibile anche: spostamento, rotazione, ecc graycode