Как преобразовать целое число в двоичный вектор?
Как преобразовать целое число в двоичный вектор с помощью R?
например :
number <- 11
[1] 1 0 1 1
каков самый быстрый способ преобразования (с использованием кода R или некоторых существующих функций из пакетов), если мне нужно преобразовать весь вектор чисел (минимальное значение = 0, максимальное =300) в двоичную матрицу ?
8 ответов
здесь intToBits
функция, которая преобразует любое целое число в вектор 32 raws, поэтому вы можете сделать это:
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
решение, которое я нашел в "книге R" М. Дж. Кроули, является следующей функцией:
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]
}
для этого вы можете использовать следующую функцию, основанную на intToBit
:
intToBitVect <- function(x){
tmp <- rev(as.numeric(intToBits(x)))
id <- seq_len(match(1,tmp,length(tmp))-1)
tmp[-id]
}
первая строка преобразует вывод intToBits в числовые 0 и 1 и ставит порядок прямо. Вторая строка проверяет, какие значения необходимо сохранить, следующим образом:
- проверьте, где первый 1 происходит с помощью
match
. Если нет 1, чтобы найти, вы спроситеmatch
вернуть длинуtmp
вектор. - создать последовательность (используя
seq_len
) от 1 в позицию, предшествующую первому появлению1
наtmp
вектор - отбросьте все эти позиции в
tmp
вектор
чтобы показать, что он работает:
> intToBitVect(11)
[1] 1 0 1 1
> intToBitVect(0)
[1] 0
Если вы хотите вернуть двоичную последовательность, то есть вектор 1 и 0, то эта функция сделает это за вас, но она может принимать только 1 число за раз.
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)
}
попробуйте пакет 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
также доступный: перенесите, поверните, graycode etc.
intToBin <- function(x){
if (x == 1)
1
else if (x == 0)
NULL
else {
mod <- x %% 2
c(intToBin((x-mod) %/% 2), mod)
}
}
итак, intToBin (10) возвращает
[1] "1" "0" "1" "0"
и если вы хотите строку вместо vector
> paste0(intToBin(10), collapse = "")
[1] "1010"