JavaRush /Java 博客 /Random-ZH /第 30 级。有关该级别主题的面试问题的答案
DefNeo
第 36 级

第 30 级。有关该级别主题的面试问题的答案

已在 Random-ZH 群组中发布
第 30 级。有关第 1 级主题的面试问题的答案
  1. 什么是 NaN?

    NaN(英文Not-a-Number)是浮点数的特殊状态之一。用于许多数学库和数学协处理器。这种情况可能在各种情况下发生,例如,当先前的数学运算完成但结果不确定时,或者如果将不满足条件的数字输入到存储单元中。

    根据 IEEE 754,通过将指数设置为保留值 11...11,并将尾数设置为 0 以外的任何值(机器无穷大的保留值)来指定此状态。符号和尾数可能携带一些附加信息:许多库将“负”NaN 输出为 -NaN。

    导致 NaN 作为响应的操作包括:

    • 所有包含 NaN 作为操作数之一的数学运算;
    • 零除以零;
    • 无穷大除以无穷大;
    • 零乘以无穷大;
    • 无穷大与相反符号的无穷大相加;
    • 计算负数的平方根[1];
    • 取负数的对数。

    有些编程语言有“沉默”和“信号”NaN:第一个,当涉及任何操作时,返回NaN,第二个导致紧急情况。通常,“安静”或“信号”由尾数的最高有效位确定。

    NaN 不等于任何其他值(甚至不等于其本身[2]);因此,检查 NaN 结果的最简单方法是将结果值与其自身进行比较。

    其他比较运算符的行为因语言而异。有些语言会产生 false[3](因此 a < b 和 b > a 对于 NaN 的行为有所不同),其他语言甚至会为“安静”的 NaN 引发崩溃。

    任何采用静默 NaN 作为参数的重要操作都将始终返回 NaN,无论其他参数的值如何。此规则的唯一例外是 max 和 min 函数,它们返回“第二个”参数的值(NaN 除外)。作为身份的简单运算会被特殊处理:例如,1NaN 等于 1。

  2. Java中如何得到无穷大?

    在 Java 中,类型double对于正无穷大和负无穷大具有特殊含义。正数除以 0.0 给出“正无穷大”,负数除以“负无穷大”。这些概念对应于类型的特殊常量Double

    代码 描述
    public static final double POSITIVE_INFINITY = 1.0 / 0.0; 加无穷大
    public static final double NEGATIVE_INFINITY = -1.0 / 0.0; 负无穷大
    1. 我们将字符串转换为数字,其中包含字母。答案是 NaN
    2. 无穷大减无穷大。答案是 NaN
    3. 还有许多其他情况,他们期望答案中包含数字,但结果未知。

    任何包含 NaN 的运算都会产生 NaN。

    无穷大的动作:
    表达 结果
    n ÷ ±无穷大 0
    ±无穷大×±无穷大 ±无穷大
    ±(非零)÷ ±无穷大
    无穷大+无穷大 无穷
    ±0 ÷ ±0
    无穷大 - 无穷大
    ±无穷大 ÷ ±无穷大
    ±无穷大×0
  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, то ленивых вычислений происходить не будет)

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION