How to convert integer number into binary vector?
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 askmatch
to return the length of yourtmp
vector. - create a sequence (using
seq_len
) from 1 to the position previous to the first occurence of1
in thetmp
vector - drop all those positions in the
tmp
vector
To show it works :
> intToBitVect(11)
[1] 1 0 1 1
> intToBitVect(0)
[1] 0
Related videos on Youtube
Qbik
Updated on July 28, 2022Comments
-
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 almost 9 yearsI get
length(number2binary(0, 32)) == 31
... ? -
nikpod over 6 yearsshouldn't 3rd row be 1011?
-
digEmAll over 6 years@nikpod You want the reverse of the 3rd column, which is
0000...00001011
-
nikpod over 6 yearsmy bad, was looking at it row wise. Numbers 5 and 4 are coincidentally represented in rows as well
-
onyambu almost 6 years
sapply(decimals,function(x)as.integer(paste(rev( as.integer(intToBits(x))),collapse="")))
-
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 about 5 years
matrix(as.integer(intToBits(decimals)), nrow = 32)
would probably be faster as it's vectorised. -
Cos about 2 yearsbinaryLogic was removed from CRAN