how to find out if a number is even or not

1.095 Ansichten (letzte 30 Tage)
divya r
divya r am 23 Okt. 2012
Kommentiert: Walter Roberson am 28 Okt. 2021
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 Kommentare
luis fonseca
luis fonseca am 9 Okt. 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
Steven Lord am 9 Okt. 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

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 23 Okt. 2012
Bearbeitet: MathWorks Support Team am 9 Nov. 2018
See mod and rem
  1 Kommentar
Dillen.A
Dillen.A am 5 Feb. 2020
Bearbeitet: Dillen.A am 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.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (8)

Jan
Jan am 23 Okt. 2012
Care for exceptions:
NaN, Inf, 1e54, int8(-128)
There are some FEX submission for this task, e.g. FEX: parity checker.

luis fonseca
luis fonseca am 9 Okt. 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 Kommentare
madhan ravi
madhan ravi am 9 Okt. 2020
what happens when N is an array?
Howard Lam
Howard Lam am 15 Okt. 2021
use .^

Melden Sie sich an, um zu kommentieren.


Matt J
Matt J am 23 Okt. 2012
if bitget(A,1) %odd
else %even
end
  2 Kommentare
Matt J
Matt J am 23 Okt. 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
Josh Meyer am 10 Okt. 2018
Bearbeitet: Josh Meyer am 10 Okt. 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.

Melden Sie sich an, um zu kommentieren.


Ibn e Adam
Ibn e Adam am 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 Kommentare
Walter Roberson
Walter Roberson am 26 Feb. 2020
Ibn e Adam did not define the variables "even" or "odd" so we do not know what datatypes would be returned.
Matt J
Matt J am 26 Feb. 2020
not in inverted commas
I guess inverted commas = single quotes

Melden Sie sich an, um zu kommentieren.


Anmol  singh
Anmol singh am 10 Apr. 2020
Bearbeitet: Anmol singh am 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 Kommentar
Walter Roberson
Walter Roberson am 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

Melden Sie sich an, um zu kommentieren.


Matt J
Matt J am 9 Okt. 2020
Bearbeitet: Matt J am 9 Okt. 2020
One more way to test even-ness in a scalar, s,
isEven=false;
try, validateattributes(s,"numeric","even"); isEven=true; end,

Howard Lam
Howard Lam am 15 Okt. 2021
Bearbeitet: Howard Lam am 27 Okt. 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 Kommentare
Howard Lam
Howard Lam am 27 Okt. 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
Walter Roberson am 28 Okt. 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

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by