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

Qbi*_*bik 20 binary integer r numeric binary-data

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

例如 :

number <- 11
[1] 1 0 1 1
Run Code Online (Sandbox Code Playgroud)

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

dig*_*All 25

有一个intToBits函数可以将任何整数转换为32个raw的向量,所以你可以这样做:

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
Run Code Online (Sandbox Code Playgroud)


Pau*_*tra 20

这篇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))]
       }
    }
Run Code Online (Sandbox Code Playgroud)

而对于一些例子:

> 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
Run Code Online (Sandbox Code Playgroud)

  • 我得到 `length(number2binary(0, 32)) == 31`... ? (2认同)

小智 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] 
}
Run Code Online (Sandbox Code Playgroud)


小智 6

试试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
Run Code Online (Sandbox Code Playgroud)

也可用:shift,rotate,graycode等.


Jor*_*eys 5

您可以使用以下功能,基于intToBit:

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

第一行将intToBits输出转换为数字0和1,并将顺序放置.第二行检查需要保留的值,如下所示:

  • 检查第一个出现在哪里使用match.如果没有找到1,则要求match返回tmp向量的长度.
  • 创建一个序列(使用seq_len1)与前一次到第一次出现的位置1tmp矢量
  • 删除tmp向量中的所有位置

显示它的工作原理:

> intToBitVect(11)
[1] 1 0 1 1
> intToBitVect(0)
[1] 0
Run Code Online (Sandbox Code Playgroud)