Как пример в псевдокоде:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Вместо оператора по модулю, который имеет немного другую семантику, для неотрицательных целых чисел вы можете использовать оператор остатка%
. Для вашего точного примера:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Это может быть упрощено до одной строки:
isEven = (a % 2) == 0;
%
оценивается, прежде==
чем я посмотрел его, поэтому было бы неясно, эквивалентно ли выражение(a%2)==0
илиa%(2==0)
. Я думаю, это менее важно в Java, где логическое значение не совпадает с целым числомВот представление вашего псевдокода в минимальном коде Java;
Теперь я разобью его на составляющие. Оператор модуля в 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).
Часто это тонкое различие не имеет значения. Возвращаясь к вашему коду вопроса, однако, есть несколько способов решения проблемы «равномерности».
Первый подход хорош для начинающих, потому что он особенно многословен.
Второй подход лучше использует язык и приводит к более сжатому коду. (Не забывайте, что оператор == возвращает логическое значение.)
Третий подход здесь для полноты и использует троичный оператор. Хотя троичный оператор часто очень полезен, в этом случае я считаю второй подход более предпочтительным.
Четвертый и последний подход заключается в использовании знаний о двоичном представлении целых чисел . Если младший бит равен 0, то число является четным. Это можно проверить с помощью побитового оператора и (&). Хотя этот подход является самым быстрым (вместо деления вы делаете простую битовую маскировку), он, возможно, немного сложен для новичка.
Здесь я использовал побитовый оператор-and и представил его в краткой форме, показанной в варианте 2. Перезапись его в форме варианта 1 (и, альтернативно, в варианте 3) оставлена читателю в качестве упражнения. ;)
Надеюсь, это поможет.
источник
Чтобы заставить работу Java% (REM) работать как MOD для отрицательных значений X и Y, вы можете использовать этот метод:
или с троичным оператором (короче, но не возможно или менее эффективно в некоторых ситуациях):
источник
В Java нет оператора по модулю, как в Си. % в Java является оператором остатка. Для положительных целых чисел он работает точно так же, как и по модулю, но по отрицательным целым числам он работает по-разному и, в отличие от модуля, может работать и с числами с плавающей запятой. Тем не менее, редко использовать% на чем-либо, кроме положительных целых чисел, поэтому, если вы хотите назвать это по модулю, не стесняйтесь!
источник
array[x mod array.length]
всегда получать доступ к элементу в моем массиве, а не пытаться индексировать отрицательные позиции.(x % y + y) % y
или начиная с Java 8,Math.floorMod(x, y)
Хотя можно сделать правильное по модулю, проверив, является ли значение отрицательным, и исправить его, если оно есть (как многие предлагали), существует более компактное решение.
Сначала это будет делаться по модулю, ограничивая значение диапазоном -b -> + b, а затем добавляя b, чтобы обеспечить положительное значение, позволяя следующему по модулю ограничить его диапазоном 0 -> b.
Примечание: если b отрицательно, результат также будет отрицательным
источник
Код работает намного быстрее без использования модуля:
источник
источник
Вы должны изучить спецификацию перед использованием оператора remainder%:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3
источник
В Java это
%
оператор: 15.17.3. Остаток Оператор%Обратите внимание, что
floorMod
вjava.lang.Math
классе также есть результат, отличный от%
аргументов с разными знаками:public static int floorMod(int x, int y)
источник
%
тот, который также работает должным образом, когда аргумент также отрицателен. Ни один из других ответов на самом деле не является правильным, так как они идут с оговоркой, что% на самом деле не по модулю, если аргументы не являются положительными. В частности, если вы хотите отобразить каждое целое число в последовательную позицию в массиве, тоarray[floorMod(i, array.length)
работает правильно, даже если индексi
переходит в отрицательную территорию. Не так с%
.Также мод можно использовать так:
b
будет равно 1. Потому что7 % 2 = 1
.источник
Оператор остатка в Java есть
%
и оператор по модулю может быть выражен какисточник
Как уже отмечали другие,
%
оператор (остаток) не совпадает сmod
операцией / функцией математического модуля.Чтобы иметь способ использовать операцию математического модуля и не заботиться о знаке перед
x
одним, можно использовать:Может быть, эта картина помогает лучше понять ее (мне было трудно сначала обдумать это)
источник
int
переменной 2 ^ 32 .floorMod
Метод не делает это правильно (но вам могут понадобиться дополнительные расчеты , еслиn
отрицательна).Другой способ это:
Но самый простой способ по-прежнему:
Как сказал @Steve Kuo.
источник
В
Java
, то мод операция может быть выполнена , например , как:Примечание: моды операция отличается от остатка операции. В
Java
, то оставшаяся операция может быть выполнена , например , как:источник
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
для больших значений.Оператор по модулю% (знак процента). Чтобы проверить на равномерность или вообще сделать по модулю степень 2, вы также можете использовать & (оператор and), например isEven =! (A & 1).
источник
Альтернатива коду от @Cody:
Используя оператор модуля:
Я думаю, что это немного лучший код, чем писать if / else, потому что меньше дублирования и неиспользуемой гибкости. Это требует немного больше умственных способностей, чтобы исследовать, но хорошее наименование
isEven
компенсирует.источник