23

如何使用R将整数转换为二进制向量?

例如 :

number <- 11
[1] 1 0 1 1

如果我需要将整个数字向量(最小值 = 0,最大值 = 300)转换为二进制矩阵,最快的转换方法是什么(使用 R 代码或包中的一些现有函数)?

跟着兔子: base::intToBits

4

10 回答 10

29

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
于 2012-08-23T09:09:58.967 回答
23

这个SO post建议了这个intToBits功能。我定义了 function 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
于 2012-08-23T09:04:23.670 回答
13

试试 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

也可用:移位、旋转、格雷码等。

于 2017-02-04T15:52:03.683 回答
7

您可以使用以下功能,基于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
于 2012-08-23T09:24:35.373 回答
7

我在 MJ Crawley 的“The R Book”中找到的解决方案是以下功能:

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] 
}
于 2014-10-13T18:18:18.877 回答
4

还有一个:

toBits <- function (x, nBits = 8){
   tail(rev(as.numeric(intToBits(x))),nBits)
}
于 2016-01-12T13:07:03.307 回答
2

如果你想返回一个二进制序列,即一个 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)
}
于 2014-10-16T20:26:07.423 回答
2

你实际上不需要调用任何函数来得到这个 - 单独的模运算可以给出答案。

int_to_binary <- function(num, pow) {
  if(2^(pow + 1) - 1 < num) stop("Use a higher values of 'pow'")
  num %/% (2^(pow:0)) %% 2
}
于 2020-02-24T15:57:09.617 回答
1
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"
于 2016-12-20T03:23:25.767 回答
0

这是一个Rcpp实现。

在 Rstudio 中,将以下代码保存在文件中,例如binary.cpp,然后键入Source

//************************
// binary.cpp 
#include <RcppArmadillo.h>

//' @Title get the binary representation of a positive integer
// [[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::export]]
void intToBinary(int n, arma::vec& a ) {
  for(int i=0;n>0;i++){
    a[i]=n%2;
    n=n/2;
  }
}
//************************

如果 Source 顺利,从 R 控制台类型

> a <- rep(0,10) # needed to store the binary representation
> myInt <- 5 # to be converted to binary form
> intToBinary(myInt, a)
> rev(a) # print in the usual form
于 2021-08-05T08:33:01.793 回答