~~Две тильды

    Внезапно встретил такой JS-код:
    var a = ~~b;
    Сразу вспомнил, что ~ — это битовое дополнение, показалось, что написано просто
    var a = b;
    Однако битовые операции применимы только к целым числам, поэтому тут ещё неявное приведение типа. Самый короткий способ написать var a = Math.floor(b);?

    Но не ведитесь на короткую крутую запись: Math.floor() работает вдвое быстрее (проверил в FF3.6).

    ~~$x для округления работает и в Перле, причём по времени столько же, сколько int($x). Интересно, что в других языках? В Питоне, наверно, тоже сработает? Upd: не сработало.
    Share post

    Comments 12

      +3
      Питон не разрешит:

      In [1]: ~~3.61
      ---------------------------------------------------------------------------
      TypeError Traceback (most recent call last)

      /Users/farcaller/ in ()

      TypeError: bad operand type for unary ~: 'float'
        0
        Спасибо :-)
          +1
          Оно и логично: там нет неявного приведения типов.
          0
          Когда учился в универе, писал курсовую и нагородил в ней кучу «крутых» функций, аналогов давно существующих, но с побитовыми операциями. Надеялся на профит по скорости, но тесты показали, что работает оно, уже точно не помню, но как минимум на треть медленнее.
          Так что используйте побитовые операции по назначению :)
            0
            Забыл упомянуть: это был С++
            0
            В Perl-е это далеко не только округление :)
              0
              В PHP работает
              $a = ~~$b;
                0
                раз в 5-6 медленнее, чем
                $c = (int)$b;
                  0
                  А кто вам это сказал?
                  Мои тесты выдают следующее (100 тыс операций):
                  ~~
                  0.0198180675507
                  (int)
                  0.0183770656586
                  intval
                  0.0337209701538
                    0
                    пардон, это было год назад, нужно заново тестировать. возможно зависит от операционной системы…
                +2
                В Javascript нет типа «целое», поэтому булевые операции считаются более медленными.
                  0
                  Вот написал небольшой тест: jsfiddle.net/IonDen/2pf059tf
                  Скорость выполнения в хроме примерно одинакова.

                  Но, есть проблема с округлением очень больших чисел. Так что я бы не рекомендовал использовать ~~

                  Only users with full accounts can post comments. Log in, please.