# The number is odd?

Discussion in 'C++' started by nick048, Nov 2, 2006.

1. ### nick048Guest

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

Thank You and best Regards.
Gaetano

nick048, Nov 2, 2006

2. ### davidGuest

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

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

bool odd = !!(number & 1);

david

david, Nov 2, 2006

3. ### peter kochGuest

nick048 wrote:
> 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

peter koch, Nov 2, 2006
4. ### GeoGuest

david wrote:
> nick048 <> wrote:
> > Hi to all,
> > How can verify if a number is odd in C++?

>
> If the number is a scalar, then you can do this:
>
> bool odd = !!(number & 1);
>
> david

Why !! ?

Geo, Nov 2, 2006
5. ### benbenGuest

nick048 wrote:
> 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

benben, Nov 2, 2006
6. ### =?iso-8859-1?q?Kirit_S=E6lensminde?=Guest

Geo wrote:
> david wrote:
> > nick048 <> wrote:
> > > Hi to all,
> > > How can verify if a number is odd in C++?

> >
> > If the number is a scalar, then you can do this:
> >
> > bool odd = !!(number & 1);
> >
> > david

> Why !! ?

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

bool odd( number & 1 );

K

=?iso-8859-1?q?Kirit_S=E6lensminde?=, Nov 2, 2006
7. ### davidGuest

Kirit S?lensminde <> wrote:

> Geo wrote:
>> david wrote:
>> > nick048 <> wrote:
>> > > Hi to all,
>> > > How can verify if a number is odd in C++?
>> >
>> > If the number is a scalar, then you can do this:
>> >
>> > bool odd = !!(number & 1);
>> >
>> > david

>> Why !! ?

(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 ?

david, Nov 2, 2006
8. ### Michal NazarewiczGuest

david <> writes:

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

>
> 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.

--
Best regards, _ _
.o. | Liege of Serenly Enlightened Majesty of o' \,=./ `o
..o | Computer Science, Michal "mina86" Nazarewicz (o o)
ooo +--<mina86*tlen.pl>---<jid:mina86*chrome.pl>--ooO--(_)--Ooo--

Michal Nazarewicz, Nov 2, 2006
9. ### davidGuest

Michal Nazarewicz <> wrote:
>> bool odd = !!(number & 1);

> 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

david, Nov 2, 2006
10. ### Frederick GothamGuest

Kirit SÃ¦lensminde:

>> Why !! ?

!!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.

--

Frederick Gotham

Frederick Gotham, Nov 2, 2006
11. ### GeoGuest

Frederick Gotham wrote:
> Kirit SÃ¦lensminde:
>
> >> Why !! ?

>
>
> !!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
'!' !!!.

> --
>
> Frederick Gotham

Geo, Nov 2, 2006
12. ### Frederick GothamGuest

Geo:

>> !!a
>>
>> is short-hand for:
>>
>> (bool)a
>>

> 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;

--

Frederick Gotham

Frederick Gotham, Nov 2, 2006
13. ### Frederick GothamGuest

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.

--

Frederick Gotham

Frederick Gotham, Nov 2, 2006
14. ### GeoGuest

Frederick Gotham wrote:
> Geo:
>
> >> !!a
> >>
> >> is short-hand for:
> >>
> >> (bool)a
> >>

> > 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
> > '!' !!!.

>

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

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

>
> --
>
> Frederick Gotham

Geo, Nov 2, 2006
15. ### Victor BazarovGuest

Geo wrote:
> Frederick Gotham wrote:
>> Geo:
>>
>>>> !!a
>>>>
>>>> is short-hand for:
>>>>
>>>> (bool)a
>>>>
>>> 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 '!' !!!.

>>

>
> 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
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask

Victor Bazarov, Nov 2, 2006
16. ### GeoGuest

Victor Bazarov wrote:
> Geo wrote:
> > Frederick Gotham wrote:
> >> Geo:
> >>
> >>>> !!a
> >>>>
> >>>> is short-hand for:
> >>>>
> >>>> (bool)a
> >>>>
> >>> 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 '!' !!!.
> >>

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

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

>
> V
> --
> Please remove capital 'A's when replying by e-mail
> I do not respond to top-posted replies, please don't ask

Geo, Nov 2, 2006
17. ### Marcus KwokGuest

Marcus Kwok, Nov 2, 2006
18. ### =?ISO-8859-15?Q?Juli=E1n?= AlboGuest

Geo wrote:

>> (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

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

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

--
Salu2

=?ISO-8859-15?Q?Juli=E1n?= Albo, Nov 2, 2006
19. ### Mark PGuest

Geo wrote:
>
> 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.)

Mark P, Nov 3, 2006
20. ### Old WolfGuest

david wrote:
>
> (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.

Old Wolf, Nov 3, 2006