JavaRush /وبلاگ جاوا /Random-FA /سطح 30. پاسخ به سؤالات مصاحبه در مورد موضوع سطح
DefNeo
مرحله

سطح 30. پاسخ به سؤالات مصاحبه در مورد موضوع سطح

در گروه منتشر شد
سطح 30. پاسخ به سوالات مصاحبه با موضوع سطح - 1
  1. NaN چیست؟

    NaN (به انگلیسی Not-a-Number) یکی از حالات ویژه یک عدد ممیز شناور است. در بسیاری از کتابخانه های ریاضی و پردازنده های مشترک ریاضی استفاده می شود. این حالت می تواند در موارد مختلفی رخ دهد، به عنوان مثال، زمانی که یک عملیات ریاضی قبلی با یک نتیجه نامشخص کامل شده است، یا اگر عددی که شرایط را برآورده نمی کند در یک سلول حافظه وارد شده باشد.

    مطابق با IEEE 754، این حالت با تنظیم توان بر روی مقدار رزرو شده 11...11، و mantissa به هر چیزی غیر از 0 (مقدار رزرو شده برای بی نهایت ماشین) مشخص می شود. علامت و مانتیس ممکن است حاوی اطلاعات اضافی باشند: بسیاری از کتابخانه ها NaN "منفی" را به صورت -NaN خروجی می دهند.

    عملیاتی که منجر به NaN به عنوان یک پاسخ می شود عبارتند از:

    • تمام عملیات ریاضی حاوی NaN به عنوان یکی از عملوندها.
    • تقسیم صفر بر صفر؛
    • تقسیم بی نهایت بر بی نهایت;
    • ضرب صفر در بی نهایت؛
    • اضافه شدن بی نهایت با بی نهایت علامت مقابل;
    • محاسبه جذر یک عدد منفی[1]؛
    • گرفتن لگاریتم یک عدد منفی

    برخی از زبان‌های برنامه‌نویسی دارای NaN "ساکت" و "سیگنال" هستند: اولی، زمانی که در هر عملیاتی درگیر می‌شود، NaN را برمی‌گرداند، دومی باعث ایجاد شرایط اضطراری می‌شود. به طور معمول، "آرام" یا "سیگنال" توسط مهم ترین بیت مانتیس تعیین می شود.

    NaN با هیچ مقدار دیگری (حتی خودش [2]) برابر نیست. بر این اساس، ساده ترین روش بررسی یک نتیجه برای NaN، مقایسه مقدار حاصل با خودش است.

    رفتار سایر عملگرهای مقایسه بسته به زبان متفاوت است. برخی از زبان‌ها نادرست[3] تولید می‌کنند (به طوری که a <b و b> a با NaN متفاوت رفتار می‌کنند)، برخی دیگر حتی برای NaN «بی‌صدا» خراب می‌شوند.

    هر عملیات غیر پیش پا افتاده ای که یک NaN بی صدا را به عنوان آرگومان می گیرد، بدون توجه به ارزش آرگومان های دیگر، همیشه NaN را برمی گرداند. تنها استثناهای این قانون توابع max و min هستند که مقدار آرگومان "دوم" (به غیر از NaN) را برمی گرداند. عملیات بی اهمیتی که هویت هستند به طور ویژه مورد بررسی قرار می گیرند: برای مثال، 1NaN برابر با 1 است.

  2. چگونه infinity را در جاوا بدست آوریم؟

    در جاوا تایپ 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