recursividad programa pasar para número numero lenguaje funciones entero dev convertir con como codigo binario r binary integer numeric binary-data

programa - pasar un numero entero a binario en c++



¿Cómo convertir un número entero en un vector binario? (8)

Esta publicación SO sugiere la función intToBits . number2binary la función number2binary , que incluye un argumento noBits para controlar cuántos bits se devuelven. Estándar es devolver 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))] } }

Y para algunos ejemplos:

> 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

¿Cómo convertir un número entero en un vector binario usando R?

Por ejemplo :

number <- 11 [1] 1 0 1 1

¿Cuál es el método de conversión más rápido posible (usando el código R o algunas funciones existentes de los paquetes) si necesito convertir un vector entero de números (valor mínimo = 0, máximo = 300) en una matriz binaria?


Existe la función intToBits que convierte cualquier entero en un vector de 32 raws, así que puedes hacer esto:

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


Podría usar la siguiente función para eso, basada en intToBit :

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

La primera línea convierte la salida de intToBits a un número 0 y 1, y pone el orden en línea recta. La segunda línea verifica qué valores deben conservarse, de la siguiente manera:

  • verifica donde se produce el primer 1 usando el match . Si no se encuentra un 1, pida una match para devolver la longitud de su vector tmp .
  • cree una secuencia (utilizando seq_len ) desde 1 hasta la posición anterior a la primera aparición de 1 en el vector tmp
  • soltar todas esas posiciones en el vector tmp

Para mostrarlo funciona:

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


Prueba el paquete 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

También disponible: shift, rotate, graycode etc.


Si desea devolver una secuencia binaria, es decir, un vector de 1 y 0, entonces esta función lo hará por usted, pero solo puede tomar 1 número a la vez.

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


Una solución que he encontrado en "The R Book" de MJ Crawley es la siguiente función:

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


Y otro:

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


intToBin <- function(x){ if (x == 1) 1 else if (x == 0) NULL else { mod <- x %% 2 c(intToBin((x-mod) %/% 2), mod) } }

Así que intToBin (10) devuelve

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

Y si quieres cadena en lugar de vector

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