JavaRush /Blog Java /Random-VI /Cấp độ 30. Trả lời các câu hỏi phỏng vấn về chủ đề cấp độ...
DefNeo
Mức độ

Cấp độ 30. Trả lời các câu hỏi phỏng vấn về chủ đề cấp độ

Xuất bản trong nhóm
Cấp độ 30. Trả lời câu hỏi phỏng vấn về chủ đề cấp độ - 1
  1. NaN là gì?

    NaN (tiếng Anh Not-a-Number) là một trong những trạng thái đặc biệt của số dấu phẩy động. Được sử dụng trong nhiều thư viện toán học và bộ đồng xử lý toán học. Điều kiện này có thể xảy ra trong nhiều trường hợp khác nhau, ví dụ: khi một phép toán trước đó hoàn thành với kết quả không chắc chắn hoặc nếu một số không thỏa mãn điều kiện được nhập vào ô nhớ.

    Theo IEEE 754, trạng thái này được chỉ định bằng cách đặt số mũ thành giá trị dành riêng 11...11 và giá trị định trị thành bất kỳ giá trị nào khác 0 (giá trị dành riêng cho máy vô cực). Dấu hiệu và mantissa có thể mang một số thông tin bổ sung: nhiều thư viện xuất ra NaN “âm” dưới dạng -NaN.

    Các hoạt động dẫn đến NaN dưới dạng phản hồi bao gồm:

    • tất cả các phép toán có chứa NaN là một trong các toán hạng;
    • chia số 0 cho số 0;
    • chia vô cùng cho vô cùng;
    • nhân số 0 với vô cùng;
    • phép cộng vô cùng với vô cực của dấu ngược lại;
    • tính căn bậc hai của số âm[1];
    • lấy logarit của một số âm.

    Một số ngôn ngữ lập trình có NaN “im lặng” và “tín hiệu”: ngôn ngữ thứ nhất khi tham gia vào bất kỳ thao tác nào sẽ trả về NaN, ngôn ngữ thứ hai gây ra trường hợp khẩn cấp. Thông thường, "im lặng" hoặc "tín hiệu" được xác định bởi phần quan trọng nhất của lớp phủ.

    NaN không bằng bất kỳ giá trị nào khác (thậm chí không bằng chính nó[2]); Theo đó, phương pháp đơn giản nhất để kiểm tra kết quả của NaN là so sánh giá trị kết quả với chính nó.

    Hành vi của các toán tử so sánh khác thay đổi tùy theo ngôn ngữ. Một số ngôn ngữ tạo ra false[3] (để a < b và b > a hoạt động khác với NaN), một số ngôn ngữ khác gây ra sự cố ngay cả đối với NaN “yên tĩnh”.

    Bất kỳ thao tác không tầm thường nào lấy NaN im lặng làm đối số sẽ luôn trả về NaN, bất kể giá trị của các đối số khác. Ngoại lệ duy nhất cho quy tắc này là các hàm max và min, trả về giá trị của đối số "thứ hai" (không phải NaN). Các hoạt động tầm thường là danh tính được xử lý đặc biệt: ví dụ: 1NaN bằng 1.

  2. Làm cách nào để có được vô cực trong Java?

    Trong Java, kiểu doublecó ý nghĩa đặc biệt cho cộng vô cực và trừ vô cực. Số dương chia cho 0,0 cho "cộng vô cùng" và số âm - "trừ vô cực". Các khái niệm này tương ứng với các hằng số đặc biệt thuộc loại Double:

    Mã số Sự miêu tả
    public static final double POSITIVE_INFINITY = 1.0 / 0.0; cộng vô cùng
    public static final double NEGATIVE_INFINITY = -1.0 / 0.0; trừ vô cực
    1. Chúng tôi chuyển đổi chuỗi thành một số và nó chứa các chữ cái. Đáp án là NaN
    2. Vô cực trừ vô cực. Đáp án là NaN
    3. Có nhiều tình huống khác họ mong đợi một con số trong câu trả lời nhưng lại không biết kết quả.

    Bất kỳ thao tác nào có chứa NaN đều dẫn đến NaN.

    Hành động với vô cùng:
    Sự biểu lộ Kết quả
    n -> ±Vô cực 0
    ±Vô cực × ±Vô cực ±Vô cực
    ±(không bằng 0) -> ±Vô cực
    Vô cực + Vô cực vô cực
    ±0 -> ±0 NaN
    Infinity - Infinity 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, то ленивых вычислений происходить не будет)

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION