Какой синтаксис для мода в Java - PullRequest
       124

Какой синтаксис для мода в Java

217 голосов
/ 18 сентября 2008

В качестве примера в псевдокоде:

if ((a mod 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}

Ответы [ 15 ]

344 голосов
/ 18 сентября 2008

Для неотрицательных целых чисел вы можете использовать остаток , оператор %. Для вашего точного примера:

if ((a % 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}

Это можно упростить до однострочного:

isEven = (a % 2) == 0;
110 голосов
/ 18 сентября 2008

Вот представление вашего псевдокода в минимальном коде Java;

boolean isEven = a % 2 == 0;

Теперь я разобью его на составляющие. Оператор модуля в Java является символом процента (%). Поэтому взятие int% int возвращает другое int. Оператор двойного равенства (==) используется для сравнения значений, например пары целых, и возвращает логическое значение. Затем это присваивается булевой переменной isEven. На основе приоритета оператора модуль будет оцениваться перед сравнением.

90 голосов
/ 15 января 2010

Поскольку все остальные уже дали ответ, я добавлю немного дополнительного контекста. % оператор "модуль" фактически выполняет оставшуюся операцию. Разница между 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);

Здесь я использовал побитовый оператор -и и представил его в краткой форме, показанной в варианте 2. Переписывание его в форме варианта 1 (и, альтернативно, в варианте 3) оставлено читателю в качестве упражнения. ;)

Надеюсь, это поможет.

31 голосов
/ 31 января 2010

Чтобы заставить 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;
}
12 голосов
/ 21 сентября 2013

Хотя можно сделать правильное по модулю, проверив, является ли значение отрицательным, и исправить его, если оно есть (как многие предлагали), существует более компактное решение.

(a % b + b) % b

Сначала выполняется модуль, ограничивая значение диапазоном -b -> + b, а затем добавляя b, чтобы обеспечить положительное значение, позволяя следующему модулю ограничить его диапазоном 0 -> b.

Примечание: если b отрицательно, результат также будет отрицательным

11 голосов
/ 12 октября 2010

Код работает намного быстрее без использования модуля:

public boolean isEven(int a){
    return ( (a & 1) == 0 );
}

public boolean isOdd(int a){
    return ( (a & 1) == 1 );
}
11 голосов
/ 15 января 2010

В Java нет оператора по модулю, как в Си. % в Java является оператором остатка. Для положительных целых чисел он работает точно так же, как и по модулю, но по отрицательным целым числам он работает иначе и, в отличие от по модулю, может работать и с числами с плавающей запятой. Тем не менее, редко использовать% на чем-либо, кроме положительных целых чисел, поэтому, если вы хотите назвать это по модулю, не стесняйтесь!

6 голосов
/ 18 сентября 2008
if (a % 2 == 0) {
} else {
}
4 голосов
/ 18 января 2011

Вы должны изучить спецификацию перед использованием оператора 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);
3 голосов
/ 28 июля 2010

Оператор остатка в Java равен %, а оператор по модулю может быть выражен как

public int mod(int i, int j)
{
  int rem = i % j;
  if (j < 0 && rem > 0)
  {
    return rem + j;
  }
  if (j > 0 && rem < 0)
  {
    return rem + j;
  }
  return rem;
}
...