2008-09-18 9 views

ответ

309

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

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

Это может быть упрощен до однострочника:

isEven = (a % 2) == 0; 
+72

. Если/else не нужно, просто используйте isEven = (a% 2) == 0, – 2010-07-28 15:12:45

+50

Осторожно с терминами mod и modular, потому что n (mod m) ВСЕГДА> = 0, но не n% m. n% m находится в диапазоне> -m и Jim 2012-08-24 22:36:48

+1

Почему ``% 2` помещается в скобки перед `== 0`? – 2014-06-03 19:09:55

104

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

boolean isEven = a % 2 == 0; 

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

+11

минимальный был бы без скобок;) – pstanton 2010-09-28 01:29:59

+1

Это оператор остатка, а не оператор модуля. – EJP 2016-03-30 01:51:25

1

Оператор modulo равен% (знак процента). Чтобы проверить равномерность или, как правило, по модулю для мощности 2, вы также можете использовать & (оператор и оператор), например isEven =! (A & 1).

1

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

int a = 7; 
b = a % 2; 

b будет равен 1. Потому что 7 % 2 = 1.

-2

Альтернатива код из @Cody:

Используя оператор модуля:

bool isEven = (a % 2) == 0; 

Я думаю, что это немного лучше, чем писать код, если/иначе, потому что меньше дублирования & неиспользованной гибкости , Для этого требуется немного больше возможностей мозга, но хорошее назначение isEven компенсирует.

11

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

83

Поскольку все остальные уже дали ответ, я добавлю дополнительный контекст. % оператор «модуль» фактически выполняет операцию останова. Разница между модом и речью - тонкая, но важная.

(-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); 

Третий подход здесь для полноты картины, и использует оператор ternary. Хотя тройной оператор часто очень полезен, в этом случае я считаю, что второй подход выше.

// Option 3: Ternary operator 
boolean isEven = ((a % 2) == 0) ? true : false; 

Четвертый и последний подход заключается в использовании знания binary representation of integers. Если младший значащий бит равен 0, то число четное. Это можно проверить, используя bitwise-and operator (&). Хотя этот подход является самым быстрым (вы делаете простую битовую маскировку вместо деления), это, возможно, немного продвинуто/сложно для новичков.

// Option 4: Bitwise-and 
boolean isEven = ((a & 1) == 0); 

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

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

29

Чтобы получить% в 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; 
} 
3

оператор остаток в 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; 
} 
11

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

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

public boolean isOdd(int a){ 
    return ((a & 1) == 1); 
} 
11

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

(a % b + b) % b 

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

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

1

Другой способ:

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

Но самый простой способ по-прежнему:

boolean isEven = (a % 2) == 0; 

Как @Steve Куо сказал ,

 Смежные вопросы

  • Нет связанных вопросов^_^