Відповіді:
Замість оператора модуля, який має дещо іншу семантику, для негативних цілих чисел можна використовувати оператор, що залишився%
. Для вашого точного прикладу:
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
компенсує.