Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么~N在JavaScript中执行-(N&x2B;1)?_Javascript - Fatal编程技术网

为什么~N在JavaScript中执行-(N&x2B;1)?

为什么~N在JavaScript中执行-(N&x2B;1)?,javascript,Javascript,请看下面的例子: console.log(~-2); //1 console.log(~-1); //0 console.log(~0); //-1 console.log(~1); //-2 console.log(~2); //-3 console.log(~true); //-2 console.log(~false); //-1 为什么~N像-(N+1)那样运行?它还原数字中的所有位,整数的位表示如下(对于3位数字): 它分别适用于较大的数字 因此,通过取~-2就得到了~(110b),

请看下面的例子:

console.log(~-2); //1
console.log(~-1); //0
console.log(~0); //-1
console.log(~1); //-2
console.log(~2); //-3
console.log(~true); //-2
console.log(~false); //-1

为什么
~N
-(N+1)
那样运行?

它还原数字中的所有位,整数的位表示如下(对于3位数字):

它分别适用于较大的数字


因此,通过取
~-2
就得到了
~(110b)
,它等于
001b
,也就是
1
,,因为按位对值的二进制表示不起作用。以-5为例,表示为:

1111 1111 1111 1111 1111 1111 1111 1011
二进制(32位)

记下该值(将每一位从
1
翻转到
0
或反之亦然)将为您提供:

0000 0000 0000 0000 0000 0000 0000 0100

它是十进制的4。

当您转换为二进制时,更容易看到发生了什么:

 -1 → 11111111 11111111
~-1 → 00000000 00000000 →  0

  1 → 00000000 00000001
 ~1 → 11111111 11111110 → -2
~操作员就是操作员。~逐位获取操作数,并将0更改为1,将1更改为0

~ (00010110)b = (11101001)b
现在,负整数用表示,它确切地定义为执行按位NOT并添加一:那么按位NOT与对操作数求反并减去一相同:

 4 = (00000100)b
-4 = (11111100)b
-5 = (11111011)b = ~4

你有答案

~不是二进制文件。它反转一个数字的位。JavaScript中的所有数字都是有符号的,因此第一位始终是符号位。因此正数变成负数,反之亦然-因为-1是零的倒数。另请参见JavaScript中的

~
是按位“翻转”运算符。这意味着它将反转值的二进制表示形式的位值。它只接受整数值,因此它将强制传递给int的任何值

JavaScript[1]中的整数是有符号的,并使用系统表示。例如(为了简单起见,使用8位):

如果我们把它翻过来,我们会得到

~2: 1111 1101
这是
-3
的二进制表示形式(两个补码),正如您所指出的那样,这就是
-(2+1)


[1] 它实际上表示为浮点数,但这只会使它更容易混淆,并且在实际应用中可以忽略。

您刚才不是问了这样一个问题吗?它是按位求反,还是补码。加上一,你就得到了二的补码,这是-N最常用的表示形式。它是不同的。这是另一个问题。事实上,我认为应该问这个问题,以了解tilda~是否真的有效,以及为什么结果是-(N+1)。“二的补码”当然我知道。不清楚,但在男人们回答后,现在变得更清楚了!将0更改为1,将1更改为0正如我的答案所解释的,这是因为2表示整数的补码。例如,如果使用一的补码,它将是整数的否定。
2: 0000 0010
~2: 1111 1101