How to convert integer number into binary vector?

53,038

Solution 1

There's the intToBits function that converts any integer to a vector of 32 raws, so you can do this:

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

Solution 2

This SO post suggests the intToBits function. I define the function number2binary, which includes an argument noBits to control how many bits are returned. Standard is to return 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))]
       }
    }

And for some examples:

> 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

Solution 3

Try the CRAN package "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

Also available: shift, rotate, graycode etc.

Solution 4

A solution I have found in "The R Book" by M. J. Crawley is the following function:

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

Solution 5

You could use the following function for that, based on intToBit :

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

The first line converts the intToBits output to a numeric 0 and 1, and puts the order straight. The second line checks which values need to be retained, as follows:

  • check where the first 1 occurs using match. If there's no 1 to be found, you ask match to return the length of your tmp vector.
  • create a sequence (using seq_len) from 1 to the position previous to the first occurence of 1 in the tmp vector
  • drop all those positions in the tmp vector

To show it works :

> intToBitVect(11)
[1] 1 0 1 1
> intToBitVect(0)
[1] 0
Share:
53,038

Related videos on Youtube

Qbik
Author by

Qbik

Updated on July 28, 2022

Comments

  • Qbik
    Qbik almost 2 years

    How to convert an integer number into binary vector using R?

    For example :

    number <- 11
    [1] 1 0 1 1
    

    what is the fastest possible method of conversion (using R code or some existing functions from packages) if I need to convert whole vector of numbers (minimum value = 0, maximum =300) into binary matrix ?

    Follow the rabbit : base::intToBits

  • Fabian Werner
    Fabian Werner almost 9 years
    I get length(number2binary(0, 32)) == 31... ?
  • nikpod
    nikpod over 6 years
    shouldn't 3rd row be 1011?
  • digEmAll
    digEmAll over 6 years
    @nikpod You want the reverse of the 3rd column, which is 0000...00001011
  • nikpod
    nikpod over 6 years
    my bad, was looking at it row wise. Numbers 5 and 4 are coincidentally represented in rows as well
  • onyambu
    onyambu almost 6 years
    sapply(decimals,function(x)as.integer(paste(rev( as.integer(intToBits(x))),collapse="")))
  • digEmAll
    digEmAll almost 6 years
    @Onyambu: the question was about converting int to bits matrix; mine was just an example, of course you can paste, substring, reverse and do any manipulation you like on that values. :)
  • jeanlain
    jeanlain about 5 years
    matrix(as.integer(intToBits(decimals)), nrow = 32) would probably be faster as it's vectorised.
  • Cos
    Cos about 2 years
    binaryLogic was removed from CRAN