什么是(~a).toString(2)在做什么?

时间:2016-10-13 10:22:38

标签: javascript string

我对(~a).toString(2)正在做什么感到有点困惑。

我熟悉二进制和1s补码和2s补码。

因此,5是1个补码中的000101和2个补码,该数字保持不变。

并且-5 in 1s补充是111010并且2s补充是111011

这些数字都不涉及110或100

所以我不明白110和100的二进制结果是如何从5或-5的数字得出的。

我也知道1s补码是通过翻转位来计算的,我知道2s补码是通过1s补码和加1来计算的。或者通过快捷方式将所有二进制数字保持到最前面并包括从最右边到最左边的第一个,并翻转其余数字。而且我知道,对于1s补码和2s补码的正数,你需要在最左边一个零,而且不止于此,但不必要。而对于1s和2s中的负数补码,你需要在最左边至少有一个1,而且不止于此,但不必要。但这些事实都没有解释我看到的结果。 (或许他们这样做,但我看不到它)

我已经读过tilda(〜)翻转位,但我看不出这个结果是如何产生的。

a=5
(~a).toString(2)
"-110"

a=-5
-5
(~a).toString(2)
"100"

3 个答案:

答案 0 :(得分:1)

〜用于否定大多数编程语言中的位。 现在你的变量是5,当javascript变量是64位时,它被存储在内存中(0000000000000000000000000000000000000000000000000000000000000101)

〜内存中的数字变为(1111111111111111111111111111111111111111111111111111111111111010)

现在因为它是负数(最后一位为1),所以使用2的补码计算。

这两个补码值是-6。

现在javascript在二进制文件中显示-6,它只显示6的二进制数和 - 表示负数,即-110 === -6。

如果您感到困惑,您应该查看2的补码是如何写的。

与二进制中的写-5类似 前5是(000000 ....... 000101)

翻转位(11111 ...... 1111010)

加1成为(11111 ..... 111011)

所以-5是(1111 ..... 111011)

并且做〜(-5)翻转-5以上的位(0000 .... 000100)。

和+ ve编号(第1位为0)

即显示为(100)=== 4.

答案 1 :(得分:0)

  1. 如前所述:“ toString(2)-从数字中获取二进制值”

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString

var x = 6; 
console.log(x.toString(2));       // displays '110' 
  1. (〜a)-是按位非(〜)。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

将所有位取反。 例如32位二进制〜110或

00 0000000000 0000000000 0000000110

11 1111111111 1111111111 1111111001

第一个位置上的1表示负数

答案 2 :(得分:-2)

蒂尔德只有一个algorihm: - (N + 1) 例如:

~0是 - (0 + 1),这等于-1

~6是 - (6 + 1),这等于-7

toString(2) - 从数字

生成二进制值
nls_date_format

关于代字号的信息: https://www.joezimjs.com/javascript/great-mystery-of-the-tilde/