Как преобразовать целое число в двоичный вектор?

Как преобразовать целое число в двоичный вектор с помощью R?

Например :

number <- 11
[1] 1 0 1 1

каков самый быстрый способ преобразования (с использованием кода R или некоторых существующих функций из пакетов), если мне нужно преобразовать весь вектор чисел (минимальное значение = 0, максимальное = 300) в двоичную матрицу?

Следуй за кроликом : base::intToBits


person Qbik    schedule 23.08.2012    source источник


Ответы (9)


Есть функция intToBits, которая преобразует любое целое число в вектор из 32 строк, так что вы можете сделать это:

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
person digEmAll    schedule 23.08.2012
comment
разве 3-я строка не должна быть 1011? - person nikpod; 20.12.2017
comment
@nikpod Вам нужна обратная сторона третьего столбца, то есть 0000...00001011 - person digEmAll; 20.12.2017
comment
мой плохой, смотрел на это ряд мудрый. Числа 5 и 4 также случайно представлены в строках. - person nikpod; 20.12.2017
comment
@Onyambu: вопрос был о преобразовании матрицы int в биты; мой был просто примером, конечно, вы можете вставлять, подстроку, реверсировать и делать любые манипуляции, которые вам нравятся, с этими значениями. :) - person digEmAll; 31.05.2018
comment
matrix(as.integer(intToBits(decimals)), nrow = 32), вероятно, будет быстрее, поскольку он векторизован. - person jeanlain; 23.04.2019

Этот сообщение SO предлагает функцию intToBits. Я определяю функцию number2binary, которая включает аргумент noBits для управления количеством возвращаемых битов. Стандарт - возвращать 32 бита.

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

И для некоторых примеров:

> 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
person Paul Hiemstra    schedule 23.08.2012
comment
Я получаю length(number2binary(0, 32)) == 31... ? - person Fabian Werner; 23.06.2015

Попробуйте пакет 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

Также доступны: сдвиг, поворот, код серого и т. д.

person lemon    schedule 04.02.2017

Решение, которое я нашел в «Книге 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] 
}
person atesghnagfbvgfr    schedule 13.10.2014

Для этого вы можете использовать следующую функцию на основе intToBit :

intToBitVect <- function(x){
  tmp <- rev(as.integer(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
person Joris Meys    schedule 23.08.2012

Если вы хотите вернуть двоичную последовательность, то есть вектор из 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)
}
person epwalsh    schedule 16.10.2014

И другой:

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

На самом деле вам не нужно вызывать какую-либо функцию, чтобы получить это - только модульная арифметика может дать ответ.

int_to_binary <- function(num, pow) {
  if(2^(pow + 1) - 1 < num) stop("Use a higher values of 'pow'")
  num %/% (2^(pow:0)) %% 2
}
person Melissa Key    schedule 24.02.2020

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"

И если вы хотите строку вместо вектора

> paste0(intToBin(10), collapse = "")
[1] "1010"
person schwannden    schedule 20.12.2016