# how to find out if a number is even or not

710 views (last 30 days)

Show older comments

I know in C language, for any number x using x%2 will calculate the remainder when x is divided by 2, which will help decipher whether its even or not.

How can I do this in matlab?

##### 3 Comments

luis fonseca
on 9 Oct 2020

This is the easiert way:

N = 1; % number you want to know if even or odd

%% create an expression

s = (-1)^N;

%% if s = -1, the N is odd, else N is even

if s == -1

disp('N is odd')

else

disp('N is even')

end

Steven Lord
on 9 Oct 2020

So Inf is even?

>> s = (-1)^Inf

s =

1

How about NaN?

>> s = (-1)^NaN

s =

NaN

Does this hold for a complex number as well?

>> N = 3+4i;

>> s = (-1)^N; % Not equal to -1

### Accepted Answer

Walter Roberson
on 23 Oct 2012

Edited: MathWorks Support Team
on 9 Nov 2018

##### 1 Comment

Dillen.A
on 5 Feb 2020

Edited: Dillen.A
on 5 Feb 2020

A quick example:

A = [-2 -1 0 1 2 3 4 5 6]; % A is your value or matrix

IS_EVEN = ~mod(A,2)

Which is the same as

IS_EVEN = ~bitget(abs(A),1)

And the same as

IS_EVEN = ~rem(A,2)

You can use logical() instead of ~ (isnot) for ODD, should you want booleans. Also bitget() does not work for negative integers, hence abs().

A warning though; ONLY bitget() will throw an error if an element in A is not an integer! the others will output 'odd' for fractions.

Unless you will repeat this many many times, the speed is not relevant. Otherwise, you should vectorize.

### More Answers (8)

luis fonseca
on 9 Oct 2020

This is the easiert way guys, its just math from highschool

N = 1; % number you want to know if even or odd

%% create an expression

s = (-1)^N;

%% if s = -1, the N is odd, else N is even

if s == -1

disp('N is odd')

else

disp('N is even')

end

##### 2 Comments

Matt J
on 23 Oct 2012

if bitget(A,1) %odd

else %even

end

##### 2 Comments

Matt J
on 23 Oct 2012

Note that solutions based on REM and MOD have certain non-robustness to large numbers, though I never quite understood why:

>> mod(bitmax+[1:8],2) %all are even

ans =

0 0 0 0 0 0 0 0

Josh Meyer
on 10 Oct 2018

Edited: Josh Meyer
on 10 Oct 2018

In more recent versions of MATLAB, bitmax was replaced by flintmax. This is the largest consecutive floating point number. After flintmax, the value of eps is larger than 1 (slowly increasing in powers of 2), so representable numbers larger than flintmax are no longer consecutive.

So, the reason all of those numbers are even is because flintmax is an even number and the spacing between numbers is eps(flintmax) = 2.

Ibn e Adam
on 18 Feb 2020

% function to find even/odd

% n is input number for this function

function output=even_or_odd(n)

if rem(n,2)==0

output=even;

else

output=odd;

end

end

##### 4 Comments

Walter Roberson
on 26 Feb 2020

Anmol singh
on 10 Apr 2020

Edited: Anmol singh
on 10 Apr 2020

A givennumber is even or odd for this we use & operator.

if any number is odd it must have right most bit 1.

example:

int i=5;

binary form i= 0101

now use & operator

int j=i&1;[0101&1]//

here j have 0001;

##### 1 Comment

Walter Roberson
on 10 Apr 2020

This does not work in MATLAB. In MATLAB, the operation

c = A & B

is equivalent to

if A ~= 0

if B ~= 0

c = true;

else

c = false;

end

elseif B ~= 0

c = false;

else

c = false;

end

Yes, this could be made more efficient, but this models the & operator. The more efficient operation is &&

Now notice that this is not a bitwise operation. 5&1 is not binary 0101 & 0001 giving 0001: instead it is (5~=0) and (1 ~= 0)

The MATLAB equivalent to what you are discussing is the bitand() operator

bitand(5,1)

But if you are going to do that, you might as well just ask for the last bit directly:

bitget(5,1) %the 1 is a bit number with LSB being #1

Howard Lam
on 15 Oct 2021

Edited: Howard Lam
on 27 Oct 2021

testN = 10000000;

testvar = round(rand(testN,1)*testN);

tic

output1=rem(testvar,2);

toc

tic

output2=floor(testvar/2) ~= testvar/2;

toc

tic

output3=bitget(testvar,1)==1;

toc

tic

output4 = (-1).^testvar == -1;

toc

The above produces the output

>> testisoddspeed

Elapsed time is 0.101100 seconds.

Elapsed time is 0.010721 seconds.

Elapsed time is 0.054311 seconds.

Elapsed time is 0.040362 seconds.

EDIT: Tested on AMD Ryzen 5800H 2018b. Updated answer for the case when your variables are already integers so that you do not have to cast first.

testN = 10000000;

testvar = round(rand(testN,1)*testN);

tic

output1=floor(testvar/2) ~= testvar/2;

toc

testvar = uint32(testvar);

tic

output2=rem(testvar,2)==1;

toc

tic

output3=bitget(testvar,1)==1;

toc

tic

output4 = (-1).^testvar == -1;

toc

results in

>> testisoddspeed

Elapsed time is 0.014634 seconds.

Elapsed time is 0.123930 seconds.

Elapsed time is 0.013089 seconds.

Elapsed time is 0.032953 seconds.

Bitget can be slightly faster.

##### 11 Comments

Howard Lam
on 27 Oct 2021

@Matt J Untrue in my tests. if I include casting as part of profiling, it takes significantly longer.

@Walter Roberson Did you use the new code that has casting outside of tic toc blocks?

Walter Roberson
on 28 Oct 2021

This is the code I used:

fprintf('1\n');

runtest();

fprintf('2\n');

runtest();

fprintf('3\n');

runtest();

function runtest();

testN = 10000000;

testvar = round(rand(testN,1)*testN);

tic

output1=mod(testvar,2);

toc

tic

output2=floor(testvar/2) ~= testvar/2;

toc

tic

output3=bitget(uint32(testvar),1);

toc

tic

output4 = (-1).^testvar == -1;

toc

end

### See Also

### Categories

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!