31

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

11 Answers 11

35

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
Sign up to request clarification or add additional context in comments.

6 Comments

shouldn't 3rd row be 1011?
@nikpod You want the reverse of the 3rd column, which is 0000...00001011
my bad, was looking at it row wise. Numbers 5 and 4 are coincidentally represented in rows as well
sapply(decimals,function(x)as.integer(paste(rev( as.integer(intToBits(x))),collapse="")))
matrix(as.integer(intToBits(decimals)), nrow = 32) would probably be faster as it's vectorised.
|
28

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

1 Comment

I get length(number2binary(0, 32)) == 31... ?
13

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.

2 Comments

binaryLogic was removed from CRAN
You can just pull the archived R code from the archive at cran.r-project.org/src/contrib/Archive/binaryLogic (or at github github.com/d4ndo/binaryLogic but I personally refuse to use devtools, so wouldn't install from there).
9

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

Comments

7

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

Comments

4

And another:

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

Comments

3
intToBin <- function(x){
  if (x == 1)
    1
  else if (x == 0)
    NULL
  else {
   mod <- x %% 2
   c(intToBin((x-mod) %/% 2), mod)
  }
}

So intToBin(10) returns

[1] "1" "0" "1" "0"

And if you want string instead of vector

> paste0(intToBin(10), collapse = "")
[1] "1010"

Comments

2

If you want to return a binary sequence, i.e. a vector of 1's and 0's, then this function will do that for you, but it can only take 1 number at a time.

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

Comments

2

You don't actually need to call any function to get this - modular arithmetic alone can give the answer.

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

Comments

1

Here is an Rcpp implementation.

In Rstudio, save the following code in a file, say binary.cpp, then type 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;
  }
}
//************************

If Source went smooth, from the R console type

> 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

Comments

1

if your integer is n, then let

bits=floor(log(n)/log(2))
powers = 2^(bits:0)
nBin = bitwAnd(n,powers)/powers

nBin is your desired binary sequence. You may also choose a fixed bit length.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.