[R] convert to binary to decimal

Petr Pikal petr.pikal at precheza.cz
Fri Feb 16 08:19:30 CET 2007


Hi

slight modification of your function can be probably even quicker:

fff<-function(x) sum(2^(which(rev(x))-1))
:-)
Petr

On 15 Feb 2007 at 12:13, Roland Rau wrote:

Date sent:      	Thu, 15 Feb 2007 12:13:32 -0500
From:           	"Roland Rau" <roland.rproject at gmail.com>
To:             	"Bert Gunter" <gunter.berton at gene.com>
Copies to:      	marc_schwartz at comcast.net, r-help at stat.math.ethz.ch
Subject:        	Re: [R] convert to binary to decimal

> Hi Bert,
> 
> First, I was very happy with my solution, but you win (see below)!
> 
> Best,
> Roland
> 
> 
> > bert.gunter <- function(x) {
> +   sum(x * 2^(rev(seq(along=x)) - 1))
> + }
> >
> > marc.schwartz <- function(x) {
> +   x <- as.character(as.numeric(x))
> +   b <- as.numeric(unlist(strsplit(x, "")))
> +   pow <- 2 ^ ((length(b) - 1):0)
> +   sum(pow[b == 1])
> + }
> >
> > length(huge.list)
> [1] 20000
> > head(huge.list, n=1)
> [[1]]
>  [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE
>   TRUE
> FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE
> [21] FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
>  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE [41] FALSE FALSE
> FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE
> 
> >
> > system.time(lapply(X=huge.list, FUN=bin2dec.easy))
> [1] 2.33 0.00 2.32   NA   NA
> > system.time(lapply(X=huge.list, FUN=bin2dec.recursive))
> [1] 14.91  0.00 14.90    NA    NA
> > system.time(lapply(X=huge.list, FUN=marc.schwartz))
> [1] 5.31 0.00 5.31   NA   NA
> > system.time(lapply(X=huge.list, FUN=bert.gunter))
> [1] 1.33 0.00 1.33   NA   NA
> >
> 
> 
> 
> On 2/15/07, Bert Gunter <gunter.berton at gene.com> wrote:
> >
> > why not simply:
> >
> > sum(x * 2^(rev(seq_along(x)) - 1))   ?
> >
> >
> > Bert Gunter
> > Genentech Nonclinical Statistics
> > South San Francisco, CA 94404
> > 650-467-7374
> >
> >
> > Bert Gunter
> > Nonclinical Statistics
> > 7-7374
> >
> > -----Original Message-----
> > From: r-help-bounces at stat.math.ethz.ch
> > [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Roland Rau
> > Sent: Thursday, February 15, 2007 8:22 AM To:
> > marc_schwartz at comcast.net Cc: r-help at stat.math.ethz.ch Subject: Re:
> > [R] convert to binary to decimal
> >
> > That was a nice quick distraction. Unfortunately, I am not the first
> > to answer. :-( Anyway, I offer two solutions (which are different
> > from the one of Marc Schwartz); I wrote it quickly but I hope they
> > are correct.
> >
> > Enjoy and thanks,
> > Roland
> >
> > a <- c(TRUE, FALSE, TRUE)
> > b <- c(TRUE, FALSE, TRUE, TRUE)
> >
> > bin2dec.easy <- function(binaryvector) {
> >   sum(2^(which(rev(binaryvector)==TRUE)-1))
> > }
> >
> > bin2dec.recursive <- function(binaryvector) {
> >   reversed.input <- rev(binaryvector)
> >   binaryhelper(reversed.input, 0, 0)
> > }
> >
> > binaryhelper <- function(binvector, currentpower, currentresult) {
> >   if (length(binvector)<1) {
> >     currentresult
> >   } else {
> >     if (binvector[1]) {
> >       binaryhelper(binvector[-1], currentpower+1,
> > currentresult+2^currentpower)
> >     } else {
> >       binaryhelper(binvector[-1], currentpower+1, currentresult)
> >     }
> >   }
> > }
> >
> >
> > bin2dec.easy(a)
> > bin2dec.recursive(a)
> > bin2dec.easy(b)
> > bin2dec.recursive(b)
> >
> >
> >
> >
> >
> > On 2/15/07, Marc Schwartz <marc_schwartz at comcast.net> wrote:
> > >
> > > On Thu, 2007-02-15 at 16:38 +0100, Martin Feldkircher wrote:
> > > > Hello,
> > > > we need to convert a logical vector to a (decimal) integer.
> > > > Example:
> > > >
> > > > a=c(TRUE, FALSE, TRUE) (binary number 101)
> > > >
> > > > the function we are looking for should return
> > > >
> > > > dec2bin(a)=5
> > > >
> > > > Is there a package for such a function or is it even implemented
> > > > in
> > the
> > > > base package? We found the hexmode and octmode command, but not
> > > > a binmode. We know how to program it ourselves however we are
> > > > looking
> > for
> > > > a computationally efficient algorithm.
> > > >
> > > > Martin and Stefan
> > >
> > > This is a modification of a function that I had posted a while
> > > back, so that it handles 'x' as a logical vector. I added the
> > > first line in the function to convert the logical vector to it's
> > > numeric equivalent and then coerce to character:
> > >
> > > bin2dec <- function(x)
> > > {
> > >   x <- as.character(as.numeric(x))
> > >   b <- as.numeric(unlist(strsplit(x, "")))
> > >   pow <- 2 ^ ((length(b) - 1):0)
> > >   sum(pow[b == 1])
> > > }
> > >
> > >
> > > a <- c(TRUE, FALSE, TRUE)
> > >
> > > > bin2dec(a)
> > > [1] 5
> > >
> > > HTH,
> > >
> > > Marc Schwartz
> > >
> > > ______________________________________________
> > > R-help at stat.math.ethz.ch mailing list
> > > https://stat.ethz.ch/mailman/listinfo/r-help
> > > PLEASE do read the posting guide
> > > http://www.R-project.org/posting-guide.html
> > > and provide commented, minimal, self-contained, reproducible code.
> > >
> >
> >         [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide
> > http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.
> >
> >
> 
>  [[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html and provide commented,
> minimal, self-contained, reproducible code.

Petr Pikal
petr.pikal at precheza.cz



More information about the R-help mailing list