JavaRush /בלוג Java /Random-HE /רמה 30. תשובות לשאלות ראיון בנושא הרמה
DefNeo
רָמָה

רמה 30. תשובות לשאלות ראיון בנושא הרמה

פורסם בקבוצה
רמה 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. איך להשיג אינסוף בג'אווה?

    בג'אווה, לסוג 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 NaN
    אינסוף - אינסוף 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, то ленивых вычислений происходить не будет)

הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION