2016-08-02 3 views
3

Я имел взгляд на Jason Davies's Word Cloud source on Github и в index.js есть некоторые переменные, объявленные как это:синтаксис Javascript: объявления переменных с «<<" or ">>»

cw = 1 <<11>> 5, 
ch = 1 << 11; 

Я заметил закономерность: значения перед " < < "умножает значение после" < < ";
значение после «< <» является 2 величиной указанного значения;
Значение после «>>» (далее «< <») делит это число раньше (что также равно двум двум величине значения);

мне было интересно:

  1. вообще какие использует для этого типа заявления и откуда оно взялось

  2. , как это добавить значение кода в остальной части План Джейсона Дэвиса?

+1

Я думаю, что он просто глупо. Он объявляет 'cw' как' 1 << 11 >> 5', но тогда каждое место в этом файле, которое фактически использует 'cw', имеет' (cw << 5) '. (Сначала я подумал, что, может быть, это была странная попытка самодокументировать, что эти переменные должны использоваться для целей маскирования бит, но на самом деле они не используются для этого.) – nnnnnn

+0

* «Как это добавляет ценность для код в остальной части раскладки Джейсона Дэвиса? »*. Это не так, на самом деле это просто заставляет его работать немного медленнее (по сравнению с просто 'cw = 64'). Похоже, программисту было просто скучно. –

ответ

2

Смотреть это link

В основном, << и >> делать побитового сдвига. Если вы сделаете a << b, он будет представлять a в виде номера в базе 2 (0 с и 1 с) и сдвинуть все цифры влево на b позиций. Это математически эквивалентно

a * 2^b 

>> тот же самый принцип, но он смещается вправо. Это почти аналогично делению в 2 раза, но есть особый случай, когда значение intial нечетное: он портирует результат.

⌊(a/2^b)⌋ 

Если у вас есть 1 <<11>> 5, левые и правые сдвиги компенсируют друг друга, мы в конечном итоге на самом деле с

1 << 6 === 64 === 1 * 2^6 
+0

Ну да, это то, что делают операторы '<<' and '>>', но вопрос спрашивает, в чем смысл их использования в этих объявлениях. В рассматриваемом файле JS каждый раз, когда используется переменная 'cw', она выглядит как' (cw << 5) '. – nnnnnn

+0

Я не могу подтвердить, так ли это в JS, но выполнение бит-музаций обычно более результативно по сравнению с выполнением умножений. Предположим, вы знаете, что хотите умножить на несколько кратных 2, лучше было бы сдвинуть левый сдвиг, а не делать умножение. Тем не менее, вы видите, что чаще всего в более сложном программировании. – jonathanGB

+3

Несомненно. Но в * объявлении * было бы более сложно сказать 'cw = 64'. Или 'cw = 2048', а затем * not * say' (cw << 5) 'каждый раз, когда используется переменная. Исходный код просто странный.(Кстати, если вы были готовы подтвердить производительность, вы могли бы сделать некоторые тесты на https://jsperf.com/, за исключением того, что они, похоже, сейчас не работают для обновлений.) – nnnnnn

Смежные вопросы