JavaRush /Java Blog /Random-TW /第 30 級。有關該級別主題的面試問題的答案
DefNeo
等級 36

第 30 級。有關該級別主題的面試問題的答案

在 Random-TW 群組發布
第 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
    無窮大 - 無窮大
    ±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, то ленивых вычислений происходить не будет)

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION