Como um exemplo no pseudocódigo:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Em vez do operador módulo, que tem semântica ligeiramente diferente, para números inteiros não negativos, você pode usar o operador restante%
. Para seu exemplo exato:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Isso pode ser simplificado para uma linha:
isEven = (a % 2) == 0;
%
era avaliado antes de==
procurá-lo, portanto não seria claro se a expressão é equivalente a(a%2)==0
oua%(2==0)
. Eu acho que é menos importante em java onde um booleano não é o mesmo como um inteiroAqui está a representação do seu pseudocódigo no código Java mínimo;
Agora vou dividi-lo em seus componentes. O operador de módulo em Java é o caractere de porcentagem (%). Portanto, pegar um int% int retorna outro int. O operador double equals (==) é usado para comparar valores, como um par de ints e retorna um booleano. Isso é então atribuído à variável booleana 'isEven'. Com base na precedência do operador, o módulo será avaliado antes da comparação.
fonte
Como todo mundo já deu a resposta, adicionarei um pouco de contexto adicional. % o operador "módulo" está realmente executando a operação restante. A diferença entre mod e rem é sutil, mas importante.
(-1 mod 2) normalmente forneceria 1. Mais especificamente, dados dois números inteiros, X e Y, a operação (X mod Y) tende a retornar um valor no intervalo [0, Y). Dito de forma diferente, o módulo de X e Y é sempre maior ou igual a zero e menor que Y.
A execução da mesma operação com o operador "%" ou rem mantém o sinal do valor X. Se X for negativo, você obtém um resultado no intervalo (-Y, 0]. Se X é positivo, obtém um resultado no intervalo [0, Y).
Muitas vezes, essa distinção sutil não importa. Voltando à sua pergunta de código, no entanto, existem várias maneiras de resolver a "uniformidade".
A primeira abordagem é boa para iniciantes, porque é especialmente detalhada.
A segunda abordagem aproveita melhor o idioma e leva a um código mais sucinto. (Não esqueça que o operador == retorna um booleano.)
A terceira abordagem está aqui para garantir a integridade e usa o operador ternário . Embora o operador ternário seja frequentemente muito útil, neste caso, considero a segunda abordagem superior.
A quarta e última abordagem é usar o conhecimento da representação binária de números inteiros . Se o bit menos significativo for 0, o número será par. Isso pode ser verificado usando o operador bit a bit (&). Embora essa abordagem seja a mais rápida (você está usando máscaras de bits simples em vez de divisão), talvez seja um pouco avançada / complicada para um iniciante.
Aqui, usei o operador bit a bit e o representei da forma sucinta mostrada na opção 2. Reescrevendo-o na forma da opção 1 (e alternativamente na opção 3) é deixado como exercício para o leitor. ;)
Espero que ajude.
fonte
Para que a operação% (REM) do Java funcione como MOD para valores negativos de X e Y positivos, você pode usar este método:
ou com o operador ternário (mais curto, mas não possível ou menos eficiente em algumas situações):
fonte
Java, na verdade, não possui operador de módulo, como C. % em Java é um operador restante. Em números inteiros positivos, funciona exatamente como o módulo, mas funciona de maneira diferente em números inteiros negativos e, ao contrário do módulo, também pode funcionar com números de ponto flutuante. Ainda assim, é raro usar% em qualquer coisa, exceto números inteiros positivos; portanto, se você quiser chamá-lo de módulo, fique à vontade!
fonte
array[x mod array.length]
sempre acesse um elemento da minha matriz em vez de tentar indexar posições negativas.(x % y + y) % y
ou começando em Java 8,Math.floorMod(x, y)
Embora seja possível fazer um módulo adequado, verificando se o valor é negativo e corrigindo-o se for (da maneira que muitos sugeriram), existe uma solução mais compacta.
Isso fará primeiro o módulo, limitando o valor ao intervalo -b -> + b e adicione b para garantir que o valor seja positivo, permitindo que o próximo módulo o limite ao intervalo 0 -> b.
Nota: Se b for negativo, o resultado também será negativo
fonte
O código roda muito mais rápido sem usar o módulo:
fonte
fonte
você deve examinar a especificação antes de usar o operador 'restante'%:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3
fonte
Em Java, é o
%
operador: 15.17.3. Operador restante%Observe que também existe
floorMod
najava.lang.Math
classe que fornecerá um resultado diferente%
para argumentos com sinais diferentes:public static int floorMod(int x, int y)
fonte
%
que também funciona corretamente quando o argumento também é negativo. Nenhuma das outras respostas realmente está correta, pois elas vêm com o aviso de que% não é realmente um módulo, a menos que os argumentos sejam positivos. Em particular, se você deseja mapear todos os números inteiros para uma posição consecutiva em uma matriz,array[floorMod(i, array.length)
funcionará corretamente, mesmo que o índicei
entre em território negativo. Não é assim com%
.Além disso, o mod pode ser usado assim:
b
seria igual a 1. Porque7 % 2 = 1
.fonte
O operador restante em Java é
%
e o operador módulo pode ser expresso comofonte
Como outros já apontaram, o
%
operador (restante) não é o mesmo que amod
operação / função do módulo matemático .Para ter um método para usar a operação do módulo matemático e não se importar com o sinal na frente de
x
um, pode-se usar:Talvez essa imagem ajude a entendê-la melhor (tive dificuldade em entender isso primeiro)
fonte
int
em conta a modularidade 2 ^ 32 da própria variável. OfloorMod
método faz isso corretamente (mas você pode precisar de cálculos adicionais sen
for negativo).Outra maneira é:
Mas a maneira mais fácil ainda é:
Como o @Steve Kuo disse.
fonte
Em
Java
, a operação mod pode ser executada como tal:Nota: A operação mod é diferente da operação restante . Em
Java
, a operação restante pode ser executada como tal:fonte
Math.floorMod()
possui: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).
Portanto, não é exatamente o mesmo que módulo matemático. Mas , há uma maneira de obter um resultado positivo, também no Javadoc, do mesmo método: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
operação funcionará conforme o esperado. Há também os valoresfloorMod
forlong
e, caso contrário, háBigInteger
valores maiores.O operador do módulo é% (sinal de porcentagem). Para testar a uniformidade ou geralmente fazer o módulo com uma potência de 2, você também pode usar & (o operador e) como isEven =! (A & 1).
fonte
Uma alternativa ao código de @Cody:
Usando o operador de módulo:
Eu acho que este é um código marginalmente melhor do que escrever if / else, porque há menos duplicação e flexibilidade não utilizada. Requer um pouco mais de poder cerebral para examinar, mas a boa nomeação de
isEven
compensa.fonte