web-dev-qa-db-fra.com

Comment convertir un nombre entier en vecteur binaire?

Comment convertir un nombre entier en vecteur binaire en utilisant R?

Par exemple :

number <- 11
[1] 1 0 1 1

quelle est la méthode de conversion la plus rapide possible (utilisant le code R ou certaines fonctions existantes de packages) si je dois convertir un vecteur entier de nombres (valeur minimale = 0, maximum = 300) en matrice binaire?

19
Qbik

Il y a la fonction intToBits qui convertit n'importe quel entier en un vecteur de 32 raws, ainsi vous pouvez faire ceci:

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
23
digEmAll

Ceci SO post suggère la fonction intToBits. Je définis la fonction number2binary, qui inclut un argument noBits pour contrôler le nombre de bits renvoyés. La norme est de retourner 32 bits.

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))]
       }
    }

Et pour quelques exemples:

> 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
19
Paul Hiemstra

Une solution que j'ai trouvée dans "The R Book" de M. J. Crawley est la fonction suivante:

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] 
}
7
atesghnagfbvgfr

Vous pouvez utiliser la fonction suivante pour cela, basée sur intToBit:

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

La première ligne convertit la sortie intToBits en valeurs numériques 0 et 1, et met l'ordre dans l'ordre. La deuxième ligne vérifie quelles valeurs doivent être conservées, comme suit:

  • vérifie où le premier 1 se produit en utilisant match. Si vous ne trouvez pas 1, vous demandez à match de renvoyer la longueur de votre vecteur tmp.
  • créer une séquence (en utilisant seq_len) de 1 à la position antérieure à la première occurrence de 1 dans le vecteur tmp
  • supprimer toutes les positions dans le vecteur tmp

Pour montrer que cela fonctionne:

> intToBitVect(11)
[1] 1 0 1 1
> intToBitVect(0)
[1] 0
5
Joris Meys

Essayez le package 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

Aussi disponible: décalage, rotation, graycode, etc.

5
lemon

Et un autre:

toBits <- function (x, nBits = 8){
   tail(rev(as.numeric(intToBits(x))),nBits)
}
2
Joe

Si vous voulez renvoyer une séquence binaire, c'est-à-dire un vecteur de 1 et de 0, cette fonction le fera pour vous, mais ne peut prendre qu'un nombre à la fois.

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)
}
2
epwalsh
intToBin <- function(x){
  if (x == 1)
    1
  else if (x == 0)
    NULL
  else {
   mod <- x %% 2
   c(intToBin((x-mod) %/% 2), mod)
  }
}

So intToBin (10) renvoie

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

Et si vous voulez chaîne au lieu de vecteur

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