Відповіді:
Замість оператора модуля, який має дещо іншу семантику, для негативних цілих чисел можна використовувати оператор, що залишився% . Для вашого точного прикладу:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Це можна спростити до однолінійного:
isEven = (a % 2) == 0;
%оцінюється раніше, перш ==ніж я його подивився, тому було б незрозуміло, чи вираз еквівалентний (a%2)==0або a%(2==0). Я думаю, що менш важливо в Java, де булевий не такий, як ціле число
Ось представлення вашого псевдо-коду в мінімальному коді Java;
boolean isEven = a % 2 == 0;
Зараз я розбиваю його на його компоненти. Оператор модуля на Java - це відсотковий символ (%). Тому прийняття int% int повертає інший int. Оператор подвійних рівних (==) використовується для порівняння значень, таких як пара входів і повертає булеве значення. Потім це присвоюється булевій змінній 'isEven'. Виходячи з переваги оператора, модуль буде оцінено перед порівнянням.
Оскільки всі інші вже дали відповідь, я додам трохи додаткового контексту. % оператор "modulus" фактично виконує решту операцій. Різниця між модом та ремом є тонкою, але важливою.
(-1 mod 2) зазвичай дасть 1. Більш конкретно, задавши два цілі числа, X і Y, операція (X mod Y) прагне повернути значення в діапазоні [0, Y). Сказано по-різному, модуль X і Y завжди більший або дорівнює нулю і менше Y.
Виконуючи ту саму операцію з оператором "%" або rem підтримує знак значення X. Якщо X негативний, ви отримуєте результат у діапазоні (-Y, 0]. Якщо X додатний, ви отримуєте результат у діапазоні [0, Y).
Часто ця тонка відмінність не має значення. Повернувшись до свого кодового запитання, існує декілька способів вирішення "рівності".
Перший підхід хороший для початківців, адже він особливо багатослівний.
// Option 1: Clearest way for beginners
boolean isEven;
if ((a % 2) == 0)
{
isEven = true
}
else
{
isEven = false
}
Другий підхід використовує кращі переваги мови та призводить до більш короткого коду. (Не забувайте, що оператор == повертає булеве значення.)
// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);
Третій підхід тут для повноти і використовує потрійний оператор. Хоча потрійний оператор часто дуже корисний, я вважаю другий підхід вищим.
// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;
Четвертий і остаточний підхід полягає у використанні знань про двійкове представлення цілих чисел . Якщо найменше значущий біт 0, то число парне. Це можна перевірити за допомогою побітового та оператора (&). Хоча такий підхід найшвидший (ви робите просту маскування бітів замість ділення), він, можливо, трохи просунутий / складний для початківця.
// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);
Тут я використав побитовий і оператор і представив його у стислій формі, показаній у варіанті 2. Перезапис його у варіанті 1 (а також варіант 3) залишається читачем як вправа. ;)
Сподіваюся, що це допомагає.
Щоб заставити операцію Java% (REM) працювати як MOD для від'ємних значень X та позитивних Y, ви можете використовувати цей метод:
private int mod(int x, int y)
{
int result = x % y;
if (result < 0)
{
result += y;
}
return result;
}
або з потрійним оператором (коротше, але неможливо або менш ефективно в деяких ситуаціях):
private int mod(int x, int y)
{
int result = x % y;
return result < 0? result + y : result;
}
Java насправді не має оператора модуля, як це робить C. % в Java - оператор залишку. На позитивних цілих числах він працює точно так само, як і модуль, але він діє по-різному на негативних цілих чисел і, на відміну від модуля, може працювати і з числами з плаваючою комою. Тим не менш, рідко використовувати% для будь-якого, крім позитивних цілих чисел, тому, якщо ви хочете назвати це модулем, тоді не соромтеся!
array[x mod array.length]завжди отримувати доступ до елемента в моєму масиві, а не намагатися індексувати негативні позиції.
(x % y + y) % y або починаючи з Java 8,Math.floorMod(x, y)
Хоча можна зробити належний модуль, перевіривши, чи є значення негативним, і виправити його, якщо воно є (як багато хто запропонував), є більш компактне рішення.
(a % b + b) % b
Це спочатку зробить модуль, обмеживши значення діапазоном -b -> + b, а потім додавши b, щоб переконатися, що значення є позитивним, дозволяючи наступному модулю обмежити його діапазоном 0 -> b.
Примітка: Якщо b від'ємний, результат також буде негативним
Код працює набагато швидше, не використовуючи модуль:
public boolean isEven(int a){
return ( (a & 1) == 0 );
}
public boolean isOdd(int a){
return ( (a & 1) == 1 );
}
слід вивчити специфікацію, перш ніж використовувати оператор "залишок"%:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3
// bad enough implementation of isEven method, for fun. so any worse?
boolean isEven(int num)
{
num %= 10;
if(num == 1)
return false;
else if(num == 0)
return true;
else
return isEven(num + 2);
}
isEven = isEven(a);
У Java це %оператор:
15.17.3. Оператор залишку%
Зауважте, що floorModв java.lang.Mathкласі також є результат, який дасть різний результат %для аргументів з різними ознаками:
%він також працює належним чином, коли аргумент також негативний. Жоден з інших відповідей насправді не є правильним, оскільки він приходить з відмовою від відповідальності, що% насправді не є модулем, якщо аргументи не є позитивними. Зокрема, якщо ви хочете зіставити кожне ціле число на послідовну позицію в масиві, тоді воно array[floorMod(i, array.length)працює правильно, навіть якщо індекс iпереходить у негативну територію. Не так з %.
Також мод можна використовувати так:
int a = 7;
b = a % 2;
bдорівнювали б 1. Тому що 7 % 2 = 1.
Як зазначали %інші, оператор (залишок) - це не те саме, що modфункціонування / функція математичного
модуля.
modпроти%
x mod nФункція відображаєxнаnв діапазоні[0,n).
У той час якx % nоператор переводитьxдоnв діапазоні(-n,n).
Для того, щоб мати метод використання операції математичного модуля і не піклуватися про знак перед ним, xможна використовувати:
((x % n) + n) % n
Можливо, ця картина допомагає зрозуміти її краще (мені важко було обернути голову навколо цього першого)
intзмінної. floorModМетод не робить це правильно (але вам можуть знадобитися додаткові розрахунки , якщо nнегативна).
В Java, то мод операція може бути виконана , наприклад , як:
Math.floorMod(a, b)
Примітка:
Операція моди відрізняється від решти операції. В Java, то залишилася операція може бути виконана , наприклад , як:
a % b
Math.floorMod()має: The floor modulus is x - (floorDiv(x, y) * y), has the same sign as the divisor y, and is in the range of -abs(y) < r < +abs(y).Отже, він не зовсім такий, як математичний модуль. Але є спосіб отримати позитивний результат також у Javadoc того ж методу:If the signs of arguments are unknown and a positive modulus is needed it can be computed as (floorMod(x, y) + abs(y)) % abs(y).
floorModоперація працює як очікувалося. Існує також значення floorModдля longзначень, інакше існує BigIntegerдля більших значень.
Альтернатива коду від @Cody:
Використання оператора модуля:
bool isEven = (a % 2) == 0;
Я думаю, що це незначно кращий код, ніж писати if / else, оскільки там менше дублювання та невикористаної гнучкості. Це вимагає трохи більше сил для вивчення мозку, але добре називання isEvenкомпенсує.