The number is odd?

N

nick048

Hi to all,
How can verify if a number is odd in C++?

Thank You and best Regards.
Gaetano
 
P

peter koch

nick048 said:
Hi to all,
How can verify if a number is odd in C++?

Thank You and best Regards.
Gaetano

You can do as David suggested - or prefer the less obscure (and at
least as fast)
number % 2 != 0

/Peter
 
B

benben

nick048 said:
Hi to all,
How can verify if a number is odd in C++?

Thank You and best Regards.
Gaetano

If an odd number is one that is ot divisible by two then you can just
divide that number by 2, take the remainder and see if it is 1 or 0;

Ben
 
?

=?iso-8859-1?q?Kirit_S=E6lensminde?=

Geo said:

Typo/thinko I expect. Either that or there is some subtle reason not to
just do this:

bool odd( number & 1 );


K
 
D

david

(number & 1) is synonym to (number % 2), the remainder of the division by 2.

I was thinking the logic & operator would be at least as fast as % (modulo).

The !! is there to convert a scalar to a bool, but it may be unneeded,
especially in this case where the result is only 0 or 1.
Typo/thinko I expect. Either that or there is some subtle reason not to
just do this:
bool odd( number & 1 );

This is ok, but your reasons are unclear to me:
Is this preferred/cleaner/mandatory to initialize a bool ?
int x = 3; int x(3); aren't they identical ?
bool is not a basic type ?
 
M

Michal Nazarewicz

david said:
If the number is a scalar, then you can do this:

bool odd = !!(number & 1);

AFAIK not portable. Will fail on systems with ones' complement when
number is negative (or -0). The valid way is:

bool odd = number % 2;
/* note that it can produce, -1, 0 or 1 */

If you want a value 0 or 1 use either:

int odd = !!(number % 2);

or:

int odd = number % 2 != 0;

On systems with twos' complement compiler will probably optimize those
codes to: number & 1.
 
D

david

Michal Nazarewicz said:
AFAIK not portable. Will fail on systems with ones' complement when
number is negative (or -0).

Right. I was not aware that this could exist.

david
 
F

Frederick Gotham

Kirit Sælensminde:


!!a

is short-hand for:

(bool)a

Typo/thinko I expect. Either that or there is some subtle reason not to
just do this:

bool odd( number & 1 );


Because it's dressed up to look like you're passing an argument to a
constructor. Intrinisc types are distinct from user-defined types... don't
lump them into the same category and come out with bastardisations such as:

int i(1);

, it just looks stupid, plus it makes one have to consider the "if it looks
like a declaration" rule.
 
G

Geo

Frederick said:
Kirit Sælensminde:



!!a

is short-hand for:

(bool)a
Is it really?
Where does it say that ?
What's the point any way since implicit conversion to bool is going to
happen for the assignement in the same way that it would happen for the
'!' !!!.
 
F

Frederick Gotham

Geo:
Is it really?
Where does it say that ?


! converts its value to bool, then inverts it. The second ! will invert it
again. It has the overall effect of:

(bool)a

What's the point any way since implicit conversion to bool is going to
happen for the assignement in the same way that it would happen for the
'!' !!!.


You're right. I've only ever seen it used to suppress compiler warnings.
The following gives a warning on many compilers:

bool b = 5 - 3;
 
F

Frederick Gotham

Frederick Gotham:
! converts its value to bool, then inverts it. The second ! will invert it
again. It has the overall effect of:

(bool)a


If talking about intrinsic types, of course.
 
G

Geo

Frederick said:
Geo:



! converts its value to bool, then inverts it. The second ! will invert it
again. It has the overall effect of:

(bool)a

I was questioning how it worked, just why it was better/clearer than
(bool) or static_cast said:
You're right. I've only ever seen it used to suppress compiler warnings.
The following gives a warning on many compilers:

bool b = 5 - 3;

Why would it warn about that but not !(5-3) ?
 
V

Victor Bazarov

Geo said:
I was questioning how it worked, just why it was better/clearer than
(bool) or static_cast<bool>() ?

Because it saves you typing. Because it looks cool. Because when you
refer to it in a conversation with a colleague you can say "bang-bang-ay"
instead of "ay-cast-2-bool" or some such. Bang! Bang! Isn't it cool?

(Oh, that's why it is "better". Clearer? Of course not. But who cares
when it's so cool?)

V
 
G

Geo

Victor said:
Because it saves you typing. Because it looks cool. Because when you
refer to it in a conversation with a colleague you can say "bang-bang-ay"
instead of "ay-cast-2-bool" or some such. Bang! Bang! Isn't it cool?

(Oh, that's why it is "better". Clearer? Of course not. But who cares
when it's so cool?)

I guess, and I suppose I might use it, just for the coolness, but I've
never met anyone who calls '!' bang.... or '#' pound... but let's not
go there :)
 
?

=?ISO-8859-15?Q?Juli=E1n?= Albo

Geo said:
I guess, and I suppose I might use it, just for the coolness, but I've
never met anyone who calls '!' bang.... or '#' pound... but let's not
go there :)

I prefer the Intercal nomenclature for chars. For example " is called rabbit
ears.

For those that does not known Intercal, is one of the first languages that
completely avoided the need for a GO TO instruction. It uses COME FROM
instead.

It's a nice language, but many people write coolest code using Standard C++.
 
M

Mark P

Geo said:
I guess, and I suppose I might use it, just for the coolness, but I've
never met anyone who calls '!' bang.... or '#' pound... but let's not
go there :)

Are you serious? What do you call # if not "pound"? I suppose you
could call it "sharp", but among people I know (not C# programmers)
everyone calls it "pound". Is this a geographical thing? (I'm in the U.S.)
 
O

Old Wolf

david said:
(number & 1) is synonym to (number % 2), the remainder of the division by 2.

If the number is negative, then (number & 1) might give
the wrong result.
I was thinking the logic & operator would be at least as fast as % (modulo).

The compiler will select the fastest operation, you don't
need to worry. Even the worst compilers will get this right.
The !! is there to convert a scalar to a bool, but it may be unneeded,
especially in this case where the result is only 0 or 1.

Other integral types (and pointer types, for that matter), can
be implicitly converted to bool. You do not need to explicitly
perform the conversion.
bool is not a basic type ?

Actually it is.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,535
Members
45,007
Latest member
obedient dusk

Latest Threads

Top