Ответы:
Вместо оператора по модулю, который имеет немного другую семантику, для неотрицательных целых чисел вы можете использовать оператор остатка%
. Для вашего точного примера:
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. На основании приоритета оператора модуль будет оцениваться перед сравнением.
Поскольку все остальные уже дали ответ, я добавлю немного дополнительного контекста. % оператор "модуль" фактически выполняет оставшуюся операцию. Разница между mod и rem тонкая, но важная.
(-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);
Здесь я использовал побитовый оператор-and и представил его в краткой форме, показанной в варианте 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 нет оператора по модулю, как в Си. % в 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 );
}
Вы должны изучить спецификацию перед использованием оператора remainder%:
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
переменной 2 ^ 32 . floorMod
Метод не делает это правильно (но вам могут понадобиться дополнительные расчеты , если n
отрицательна).
Другой способ это:
boolean isEven = false;
if((a % 2) == 0)
{
isEven = true;
}
Но самый простой способ по-прежнему:
boolean isEven = (a % 2) == 0;
Как сказал @Steve Kuo.
В 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
компенсирует.