Pergunta

Escrevi um intérprete que exige que eu realize uma divisão de números inteiros não assinados. Em Java, posso fazer isso como:

reg[a] = (int) ((reg[b] & 0xFFFFFFFFL) / (reg[c] & 0xFFFFFFFFL));

Mas eu gostaria de evitar a conversão para muito tempo e voltar para Int. Java já dá o operador de turno direito não assinado >>> Para esse caso especial, talvez haja uma maneira inteligente de fazer divisão não assinada da mesma maneira.

Observe que adicionar e multiplicar funcionar bem, já que os números de elogio de dois apenas funcionam.

Existe uma maneira melhor em Java para fazer isso?

Foi útil?

Solução

Bem, se você descer um pouco, poderá dividir os dois números resultantes e mudar duas vezes (porque o número resultante seria 4 vezes menor). Mas isso funcionaria apenas em números pares, já que você perderia um pouco menos significativo.

Eu realmente não acho que economizaria tempo para verificar essa condição. (ou verifique se há números menores que 231)

Outras dicas

Você sempre pode usar BigInteger, que funciona em números inteiros de tamanho arbitrário, mas isso seria muito mais caro do que promover long e voltei como int. A sua intenção é melhorar o desempenho (por isso você deseja uma solução "inteira pura" para evitar o tempo para os elencos) ou para melhorar o quão legível/compreensível é o código (nesse caso, Biginteger pode ser mais intenso)?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top