Nano Hash - криптовалюты, майнинг, программирование

Побитовые операторы Javascript - требуется пояснение

Я использую код в JS и наткнулся на эти (несвязанные) выражения:

1) var r = (d + Math.random() * 16) % 16 | 0;

2) return c === 'x' ? r : (r & 0x3 | 0x8);

Я читал кое-что о побитовых операторах, но в данном контексте это не помогает. Может кто-нибудь объяснить (желательно пошагово), как они работают? Как эти два выражения логически вычисляются и выполняются?

Заранее спасибо.


  • ЭТО НЕ Дубликат, я просил конкретный случай / пример! Ваша ссылка на общий урок. 07.06.2017
  • Первое, кажется, всего лишь уловка для сокращения числа. (2.34 | 0) === 2. Второй выглядит вполне нормально ... что конкретно вы там не понимаете? 07.06.2017
  • Есть много вопросов о побитовых операторах здесь, в SO и через Интернет. Пожалуйста, включите то, что вы почерпнули из проведенного вами исследования. В противном случае этот вопрос будет прочитан для меня этим кодом. Я имею в виду, что вы можете просто взять каждую операцию, сделать ее отдельной строкой и отладить каждую, чтобы увидеть, что она делает. 07.06.2017
  • Обратите внимание, что дубликат полезен для понимания r & 0x3 | 0x8, он, похоже, не охватывает ... | 0, который является просто хакерской заменой Math.floor. 07.06.2017
  • Второй пример больше похож на тернарный оператор 07.06.2017
  • ... В противном случае этот вопрос будет читать мне этот код. Собственно, если вы будете добры ... 07.06.2017
  • У вас есть базовые представления о двоичном представлении? Не просите быть снисходительным, просто пытаясь понять, какой ответ вы ищете. 07.06.2017
  • Неправильное использование веб-сайта и надежда на то, что кто-то из добрых желает вас насытить, не совсем защищает вас от тех, кто пытается обеспечить соблюдение правил. В некоторых случаях кто-то может ответить на вопрос такого широкого характера, однако вас не должны удивлять голоса о закрытии и напоминания о правилах. 07.06.2017
  • | 0 - это «аннотация типа» для целого числа в JavaScript. 07.06.2017
  • Верно, либо это дубликат, либо не по теме. 07.06.2017
  • Нет, я мало что знаю о двоичном представлении ... только основы. 07.06.2017
  • r & 0x3 производит число, состоящее только из младших и следующих младших битов (т. Е. Позиций значений 1 и 2 в двоичном представлении) r; он будет либо двоичным 00, 01, 10, или 11 (т. е. 1, 2, 3 или 4). Следующий | 0x8 также устанавливает четвертый бит (то есть бит 8-значения) в 1. Какая именно часть этого неясна на основании предложенного дубликата? (Вопрос не риторический - чтобы понять и ответить на ваш вопрос, необходимо указать, чем ваш вопрос отличается от информации, уже представленной в предложенном дубликате.) 07.06.2017

Ответы:


1

Первый оператор почти не имеет ничего общего с поразрядными операторами. Это просто означает:

  • присвоить r случайное число от 0 до 15, но если переменная d не определена, дайте мне 0. Он использует математический факт, что по модулю 16 любого числа вы получаете результат в диапазоне [0..15], а побитовое ИЛИ с 0 является идентификационная операция с одним исключением. Логика JavaScript обработки undefined диктует, что без | 0, когда d не определено, вы получите NaN в результате в r.

Второй оператор действительно использует побитовые операторы.

  • x & 0x03 то же самое, что и x BITWISE_AND 0011, и возвращает 2 младших бита x. x | 0x8 всегда устанавливает 4-й бит. Итак, c будет 10.., где точки - это два младших бита r. Конечно, это произойдет, только если c является строкой и равно x.

Я настоятельно рекомендую вам прочитать https://www.w3schools.com/js/js_bitwise.asp и поэкспериментируйте.

07.06.2017
  • Большое спасибо @AlexPakka! 07.06.2017
  • Обычно в 3 установлены только нижние два бита. 08.06.2017
  • @harold, спасибо! Обновил свой ответ. Я торопился ... думал & 0x7 | 0x8, глядя на & 0x3 | 0x8 09.06.2017

  • 2

    В принципе, вы можете использовать метод грубой силы и посмотреть, какие значения возвращаются в объекте, по одному для c === '' и c === 'x'.

    function x() {
        var r = (d + Math.random() * 16) % 16 | 0;  // the last or returns an integer value
        return c === 'x' ? r : (r & 0x3 | 0x8);
    }
    
    var d = 0,  // does not matter, because of % operator
        c = '',
        i,
        values = {},
        v;
    
    for (i = 0; i < 1e6; i++) {
        v = x();
        values[v] = values[v] || 0;
        values[v]++;
    }
    console.log(values);
    
    values = {};
    c = 'x';
    for (i = 0; i < 1e6; i++) {
        v = x();
        values[v] = values[v] || 0;
        values[v]++;
    }
    console.log(values);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    07.06.2017
  • Просто хотел отметить, что d имеет значение. Если d === undefined, вы получите другой результат. 07.06.2017
  • @AlexPakka, я предполагал, что d содержит числовое значение. 07.06.2017
  • Допущение допустимо, но тогда | 0 в конце строки 1 не имеет смысла. У меня две теории: это был вопрос собеседования или разработчик этого кода хотел максимально запутать будущего сопровождающего. 07.06.2017
  • @AlexPakka, похоже, это часть генерации UUID / GUID. source1, source2 08.06.2017
  • @NinaSholz вау. Vielen Dank für den Hinweis! Я чувствую себя лучше, когда никому не помогал жульничать. 08.06.2017
  • @AlexPakka, ребята, я сегодня провалил экзамен .... :( 08.06.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..