Re: function to determine if an integer is divisible by 2
Gennaro Prota wrote:
On Fri, 9 Feb 2007 12:46:55 CST, James Kanze wrote:
Carlos Moreno wrote:
James Kanze wrote:
Another obvious (and very readable solution) ends with:
return std::find( begin( table ), end( table ), input )
!= end( table ) ;
Well, you could do binary search on the table :-)
I thought about using lower_bound. Which has the advange that
you can easily modify the function to return the floor of logN
of the value.
Which is an unlikely change if the function is named is_power_of_* :-)
It's a "design pattern". The same basic solution works for
a lot of different functions. (As it happens, I've often
needed the integeral log2 of things. Mostly as a compile
time constant, however, so other meta-programming tricks
would have to be used.)
But for less than about a hundred entries, the
additional complexity probably isn't worth the bother.
In practice, though, note that the major complexity here is having a
table. I'm not saying that it is complex, just that it is probably the
element which introduces most complexity relatively to the simple
task.
Probably. My original loop is probably the best solution.
I just thought I'd throw this one out, because it is often a
good solution; it's one of the solutions which should come
to mind immediately, but I've seen far too many programmers
who never think of it.
All things considered, and given that one needs unit tests
anyway (with or without the table; you can get the algorithm or the
table wrong, for whatever reason) I think I'd prefer
x > 0 && ( x & ( x-1 ) ) == 0
Simple and neat, and you don't even bring in <algorithm>.
In this special case, that's probably what I'd write too.
But *only* because this solution has been so widely
published, and is often used as an example when teaching the
binary operators. Without that, IMHO, it's too subtle and
tricky.
[...]
PS: if we go in the mine field of readability I'm sure we'll have 50%
of the people prefer
x >= 2 && ...
Interesting. I would have thought that most people in our
field would consider 1 a power of two. But then, I would
have thought that most people working in our field would
have seen the single expression solution at some time in
their training; the fact that the question was asked
suggests that I might be overestimating the general level.
--
James Kanze (Gabi Software) email: james.kanze@gmail.com
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]