Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
 Аватар для Викдон
67 / 67 / 24
Регистрация: 21.11.2008
Сообщений: 226

Побитовые операторы (number && + number | 0 || 0)

05.10.2011, 20:32. Показов 3754. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Наткнулся на такую функцию (приводит к int, либо возвращает 0, если это нельзя сделать.) :

JavaScript
1
2
3
function toInt(number) {
   return number && + number | 0 || 0;
}
Не совсем понятно что тут происходит и в какой последовательности выполняются операторы?
JavaScript
1
number && + number | 0 || 0;
Спасибо!
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.10.2011, 20:32
Ответы с готовыми решениями:

string (32) && 32 x strings (32), effect called @Matrix
хотелось бы иметь <div class=random>вот тут</div> некое из: ±±±Время±±± / Значение 18:05:01:00001 / 0101001011010101010..010101 ...

Передача данных с select && option
Как передавать данные из этого вида форм? Заранее спасибо :)

El.value for number
Привет, яваскриптовищики или джавасриптовищики!) Мне стала интересна такая вот штука: <input id="el"...

11
Просто любитель
 Аватар для GuardCat
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
06.10.2011, 14:59
Одна вертикальная черта — это побитовое или. Если интересно подробнее, то вот: http://javascript.ru/bitwise-operators Вообще, если применять как здесь: некое число, отличное от нуля | ноль, то результатом всегда будет целая часть числа, отличного от нуля с сохранённым знаком. Операции: false|0=0; true|0=1; number (с маленькой буквы) здесь просто переменная. И функция, например, может быть записана так:
JavaScript
1
2
3
function toInt(n) {
   return n && + n | 0 || 0;
}
Оператор && — обычное логическое "и". Вроде бы, если первый операнд ноль, то просто не выполняется побайтовая операция и возвращается первый операнд, что экономит процессорное время. Но! Операция | выполняется раньше, так что смысла в этом операторе не вижу.
Давайте взглянем на очерёдность выполнения операторов:

1. |
2. &&
3. ||
4. +
Плюс здесь для того, чтобы преобразовать операнд в число. Но оператор | и без того преобразует операнд в число. На мой взгляд, от плюса можно избавиться.
Оператор || возвращает то, что с левой стороны, если оно может быть преобразовано в true. Если же нет, возвращает то, что справа. В нашем же случае, если операнд не преобразуется в true, то операция "text"|0 и без того вернёт ноль.
Итак, функция, на мой взгяд, может быть записана так:
JavaScript
1
2
3
function toInt(n) {
   return n | 0;
}
Работает идентично, в том числе с Infinity и текстовыми значениями.

Добавлено через 4 часа 26 минут
Кстати, а пример предложенный вами, как раз из комментариев к той статье, ссылку на которую я и дал =). Кто-то так яростно комментировал, что перегрузил функцию избыточно. Вообще, функцию для такого дела создавать лишнее. Нужно привести к целому числу что угодно? Используйте
Code
1
"Что угодно"|0
2
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.10.2011, 15:03
Цитата Сообщение от GuardCat Посмотреть сообщение
Но! Операция | выполняется раньше, так что смысла в этом операторе не вижу.
Давайте взглянем на очерёдность выполнения операторов:
1. |
2. &&
3. ||
4. +
GuardCat, Не совсем. Сначала вычисляется то, что слева от &&. Если вдруг там сразу false, то унарный + и | не вычисляются, и без лишних телодвижений (без ToInt32()) получается 0, который справа от || . Унарный + не нужен, Вы правы.

Ваш конечный выриант работает правильно. Вопрос производительности остаётся открытым. В одних случаях одно быстрее, в других другое.
1
Просто любитель
 Аватар для GuardCat
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
06.10.2011, 15:28
Vovan-VE, вот и я так думал. Но, toInt(false), в таком случае, вернуть должен false. Ан нет, возвращается 0. Выходит, вначале вычисляется |.
1
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.10.2011, 15:37
Цитата Сообщение от GuardCat Посмотреть сообщение
вот и я так думал. Но, toInt(false), в таком случае, вернуть должен false. Ан нет, возвращается 0. Выходит, вначале вычисляется |.
Почему, все правильно:
false && не_важно || 0
Слева от && есть false - закончили.
Слева от || есть false - вычисляем справа - получаем 0.
2
Просто любитель
 Аватар для GuardCat
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
07.10.2011, 15:06
Оу, точно.

Добавлено через 23 часа 9 минут
Стремлюсь дойти до самой сути =) Провел «бенчмарк» для обеих функций. Взял выигрышный вариант для первой функции: n = false.
Замерил время на выполнение ста тысяч вычислений для каждой из функций (в консоли):

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
var oldTime = new Date(),testIt; 
for (x=0; x<100000; x++) {
    testIt=false && + false | 0 || 0;
} 
var newTime=new Date(); 
console.log(newTime.getTime()-oldTime.getTime());
 
var oldTime = new Date(),testIt; 
for (x=0; x<100000; x++) {
    testIt=false | 0;
} 
var newTime=new Date(); 
console.log(newTime.getTime()-oldTime.getTime());
Для десяти повторений, миллисекунд на 100 000 вычислений затрачено,
вариант 1: 188 – 212
вариант 2: 194 – 226

Максимальная экономия: 38 миллисекунд на 100 000 вычислений. И это в выигрышной для первого варианта ситуации.
2
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
08.10.2011, 08:23
Цитата Сообщение от GuardCat Посмотреть сообщение
Максимальная экономия: 38 миллисекунд на 100 000 вычислений. И это в выигрышной для первого варианта ситуации.
Для 1млн вычислений.
  • false
    JavaScript
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    // первое, разница, второе
    483, <4, 487
    481, <12, 493
    499, 20>, 479
    495, 12>, 483
    489, 12>, 477
    480, <1, 481
    476, <10, 486
    482, 6>, 476
    481, =, 481
    477, <2, 479
    482, <1, 483
    476, 2>, 474
    478, 13>, 465
    480, 8>, 472
    472, <16, 488
    Можно сказать, разницы нет.
  • '42'
    JavaScript
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    // первое, разница, второе
    641, 80>, 561
    660, 89>, 571
    643, 63>, 580
    671, 92>, 579
    679, 111>, 568
    671, 79>, 592
    643, 73>, 570
    646, 74>, 572
    652, 73>, 579
    636, 89>, 547
    644, 82>, 562
    645, 67>, 578
    638, 77>, 561
    Второй явно лидирует.
  • '' (пустая строка)
    JavaScript
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    // первое, разница, второе
    493, <144, 637
    482, <149, 631
    487, <142, 629
    489, <134, 623
    484, <167, 651
    491, <156, 647
    485, <145, 630
    492, <150, 642
    487, <148, 635
    485, <149, 634
    478, <146, 624
    487, <140, 627
    Первый лидирует.
Так что на вкус и цвет, пожалуй. Смотря что будет чаще проверяться.
1
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
08.10.2011, 11:58
Могу предложить еще один вариант:

JavaScript
1
function toInt(x){ return ~~x; }
На скорость не проверял, но можете протестировать своими бенчмарками. По сути, не думаю, что приведенный вариант будет быстрее чем (x | 0), так выполняется двойная операция (инверсия).
2
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
08.10.2011, 12:24
Мой бенчмарк показал, что варианты почти одинаковые. С двойной инверсией незначительно лучше.
1
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
08.10.2011, 18:39
Цитата Сообщение от ostgals Посмотреть сообщение
Мой бенчмарк показал, что варианты почти одинаковые.
А если тестировать не false, а строки?
0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
08.10.2011, 22:47
Цитата Сообщение от Vovan-VE Посмотреть сообщение
А если тестировать не false, а строки?
Я тестировал булевый тип, строки и числа с плавающей точкой. Общая картина - такая же.
1
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
08.10.2011, 23:31


Вот. По два теста на каждый тип и вариант. С "плавающим" типом у меня чаще показывало лучший результат при варианте с двойной инверсией.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2011, 23:31
Помогаю со студенческими работами здесь

Object Number
Всем доброго времени суток, Подскажите пожалуйста как можно присвоить константе Number.MAX_VALUE значение запрошенное у пользователя? ...

Расширить объект number
как реализовать? Расширить объект number новыми свойствами и методами позволяющими задавать единицы измерения числового значения

массив, нужно получить ключ (number)
Здравствуйте, есть массив, нужно получить ключ (number 0-8) зная значения? var Massive = ; например: M = 2, Т = 4.

js аналог html - формы type = number
есть ли js (jquery) аналог html-формы &lt;input type = 'number'&gt; в виде, указанном на картинке (т.е. кнопочки &quot;вверх&quot; и...

сложение лету данных из input number
Есть нижеуказанный код. Не получается динамически показывать сумму значений input id=&quot;number1&quot;+input id=&quot;number2&quot;. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru