JavaRush /Blogue Java /Random-PT /Nível 30. Respostas às perguntas da entrevista sobre o tó...
DefNeo
Nível 36

Nível 30. Respostas às perguntas da entrevista sobre o tópico do nível

Publicado no grupo Random-PT
Nível 30. Respostas às perguntas da entrevista sobre o tema do nível - 1
  1. O que é NaN?

    NaN (Inglês Not-a-Number) é um dos estados especiais de um número de ponto flutuante. Usado em muitas bibliotecas matemáticas e coprocessadores matemáticos. Esta condição pode ocorrer em vários casos, por exemplo, quando uma operação matemática anterior foi concluída com um resultado incerto ou se um número que não satisfaz as condições foi inserido em uma célula de memória.

    De acordo com IEEE 754, este estado é especificado definindo o expoente para o valor reservado 11...11, e a mantissa para algo diferente de 0 (o valor reservado para o infinito da máquina). O sinal e a mantissa podem conter algumas informações adicionais: muitas bibliotecas produzem NaN “negativo” como -NaN.

    As operações que resultam em NaN como resposta incluem:

    • todas as operações matemáticas contendo NaN como um dos operandos;
    • dividindo zero por zero;
    • dividindo infinito por infinito;
    • multiplicando zero por infinito;
    • adição de infinito com infinito de sinal oposto;
    • calcular a raiz quadrada de um número negativo[1];
    • tomando o logaritmo de um número negativo.

    Algumas linguagens de programação possuem NaN “silencioso” e “sinal”: a primeira, quando envolvida em alguma operação, retorna NaN, a segunda causa uma emergência. Normalmente, "silêncio" ou "sinal" é determinado pela parte mais significativa da mantissa.

    NaN não é igual a nenhum outro valor (nem mesmo a si mesmo[2]); Conseqüentemente, o método mais simples de verificar um resultado para NaN é comparar o valor resultante consigo mesmo.

    O comportamento de outros operadores de comparação varia de acordo com o idioma. Algumas linguagens produzem false[3] (de modo que a < b e b > a se comportam de maneira diferente com NaN), outras travam mesmo para NaN “silencioso”.

    Qualquer operação não trivial que receba um NaN silencioso como argumento sempre retornará NaN, independentemente do valor dos outros argumentos. As únicas exceções a esta regra são as funções max e min, que retornam o valor do "segundo" argumento (diferente de NaN). Operações triviais que são identidades são tratadas de maneira especial: por exemplo, 1NaN é igual a 1.

  2. Como obter o infinito em Java?

    Em Java, type doubletem significados especiais para mais infinito e menos infinito. Um número positivo dividido por 0,0 dá "mais infinito" e um número negativo - "menos infinito". Esses conceitos correspondem a constantes especiais do tipo Double:

    Código Descrição
    public static final double POSITIVE_INFINITY = 1.0 / 0.0; mais infinito
    public static final double NEGATIVE_INFINITY = -1.0 / 0.0; menos infinito
    1. Convertemos a string em um número e ela contém letras. A resposta é NaN
    2. Infinito menos infinito. A resposta é NaN
    3. Existem muitas outras situações em que se espera um número na resposta, mas o resultado é desconhecido.

    Qualquer operação que contenha NaN resulta em NaN.

    Ações com infinito:
    Expressão Resultado
    n ÷ ±Infinito 0
    ±Infinito × ±Infinito ±Infinito
    ±(diferente de zero) ÷ ±Infinito
    Infinito + Infinito Infinidade
    ±0 ÷ ±0 NaN
    Infinito - Infinito NaN
    ±Infinity ÷ ±Infinity NaN
    ±Infinity × 0 NaN
  3. Как проверить, что в результате вычисления получилась бесконечность?

    Есть ответ на StackOverFlow.

    Все сводится к выводу System.out.println()

  4. What такое битовая маска?

    Битовая маска — это когда хранится много различных логических значений (true/false) в виде одного целого числа. При этом каждому boolean-значению соответствует определенный бит.

  5. Где применяют битовые маски?

    В основном там, где надо компактно хранить много информации об an objectх. Когда хранишь много информации об an objectе, всегда наберется пара десятков логических переменных. Вот их всех удобно хранить в одном числе. Именно хранить. Т.к. пользоваться им в работе не так уж удобно.

  6. Как установить бит в единицу в битовой маске?

    Опираясь на лекции можно ответить таким codeом:

    Здесь использовал метод Integer.toBinaryString(), дабы проверить себя, а вдруг)

    public class BitMask {
    
        public static void main(String[] args) {
            int a = 9;
    
           a |= (1<<2); // установить в 1 бит 2
    
    
            System.out.println(Integer.toBinaryString(a) + " "+ a);
        }
    }

    Вывод такой:

    1101 13

  7. Как установить бит в ноль в битовой маске?

    public class BitMask {
    
    public static void main(String[] args) {
    int a = 15;
    
    a &= ~(1<<2); // установить в 0 бит 2
    System.out.println(Integer.toBinaryString(a) + " "+ a);
    
        }
    }

    Вывод:

    1011 11

    Я взял число 15, так How на нем более наглядно видно, куда устанавливается 0.

  8. Как получить meaning определенного бита в битовой маске?

    public class BitMask {
    
    public static void main(String[] args) {
         int a = 15;
    
         a &= ~(1<<2); // установить в 0 бит 2
    
         int c = a & (1<<2); // узнаем про 2 бит
         int d = a & (1<<3); // узнаем про 3 бит
        System.out.println(Integer.toBinaryString(a) + " "+ a + " " + c +" "+ d);
    
        }
    }

    Вывод:

    1011 11 0 8

    C 0 все понятно, на том месте и вправду 0. А переменная d возвращает meaning запрашиваемого бита (в 10-ой системе).

  9. What такое ленивое вычисление выражения?

    Статья: Ленивое программирование и ленивые вычисления

    Это ленивые вычисления (lazy evaluation). В ленивых вычислениях ни один параметр не вычисляется, пока в нем нет необходимости. Программы фактически начинаются с конца и работают от конца к началу. Программа вычисляет, что должно быть возвращено, и продолжает движение назад, чтобы определить, Howое meaning для этого требуется. В сущности каждая функция вызывается с promise'ами для каждого параметра. Когда для вычисления необходимо meaning, тогда выполняется promise. Поскольку code выполняется только тогда, когда необходимо meaning, это называется вызов по необходимости (call-by-need). В традиционных языках программирования instead of promise'ов передаются значения, это называется вызов по значению(call-by-value).

    Технология программирования "вызов по необходимости" имеет ряд преимуществ. Потоки имплементируются автоматически. Ненужные значения никогда не вычисляются. Однако, поведение ленивых программ часто трудно предсказать. В программах типа "вызов по значению" порядок вычисления довольно предсказуем, поэтому любые time- or sequence-based вычисления относительно легко имплемнтировать. В ленивых языках, где специальные конструкции, например, monads, необходимы для описания явно упорядоченных событий, это намного труднее. Все это также делает связь с другими языками более трудной.

    Существуют языки программирования, например, Haskell и Clean, использующие ленивое программирование по умолчанию. Кроме того, для некоторых языков, таких How Scheme, ML и другие, существуют ленивые версии.

    Иногда, откладывая вычисления до тех пор, пока не понадобится их meaning, вы можете оптимизировать speed выполнения программы or реструктурировать программу в более понятную форму. Несмотря на свою ценность, методы ленивого программирования не слишком широко используются or даже не очень известны. Подумайте о том, чтобы добавить их в ваш арсенал.

  10. Чем отличается использование && и & для типа boolean?

    && — это логическое «и». (В этом случае имеют место ленивые вычисления: некоторые вычисления опускаются, когда результат и так ясен)

    & — это побитовое «и» (Если применить этот оператор к переменным типа Boolean, то ленивых вычислений происходить не будет)

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION