【问题标题】:What exactly does ~ do? [duplicate]~ 到底是做什么的? [复制]
【发布时间】:2014-02-15 14:21:45
【问题描述】:

我有时会在代码中看到符号 ~。我用~1 试了一下,它显示0。 因此,我可以看到一些使用这个技巧的代码:

if ( !~text.indexOf('a') ){ }

检查真实值。是不是有点移位?

【问题讨论】:

标签: javascript operators


【解决方案1】:

这是bitwise NOT operator。它将操作数转换为 32 位整数,然后生成该整数的 one's complement(反转每一位)。

最后,! 将返回true 当且仅当该操作的结果是0

一些例子可能会有所帮助:

  x |   x (bin) | ~x (bin)  |  ~x |   !~x
 -3 | 1111…1101 | 0000…0010 |   2 | false
 -2 | 1111…1110 | 0000…0001 |   1 | false
 -1 | 1111…1111 | 0000…0000 |   0 |  true
  0 | 0000…0000 | 1111…1111 |  -1 | false
  1 | 0000…0001 | 1111…1110 |  -2 | false

换句话说,

if ( !~text.indexOf('a') ) { }

相当于:

if ( text.indexOf('a') == -1 ) { }

【讨论】:

    【解决方案2】:

    ~bitwise negation operator[MDN]。它将其操作数转换为 32 位整数,并将所有 1s 交换为 0s,并将所有 0s 交换为 1s。

    例如:

    0000 0000 0000 0000 0000 0000 0000 0000 = 0
    1111 1111 1111 1111 1111 1111 1111 1111 = ~0 = -1
    

    您可以使用棘手的!~text.indexOf(str) 而不是text.indexOf(str) !== -1),因为~1 === 0!0 === true

    【讨论】:

      【解决方案3】:

      ~ 是一元否定运算符。基本上是将操作数转换为 32 位整数,然后翻转整数的每一位。

      ~12 =
      ~(00000000 00000000 00000000 00001100) =
       (11111111 11111111 11111111 11110011) =
      -13
      

      【讨论】:

        猜你喜欢
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        • 2012-12-24
        • 2015-08-10
        • 2015-03-28
        • 2014-11-20
        • 2014-11-11
        • 1970-01-01
        相关资源
        最近更新 更多