为了账号安全,请及时绑定邮箱和手机立即绑定

~(“双倾斜”)在Javascript中做什么?

~(“双倾斜”)在Javascript中做什么?

青春有我 2019-07-13 09:29:20
今天我正在看一个网络游戏物理图书馆,偶然发现了~操作员。我知道,一个~是一个按位计算的不,这会使~一个不,这将返回相同的价值,不是吗?
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

它删除小数点之后的所有内容,因为按位运算符隐式地将其操作数转换为有符号的32位整数。不管操作数是(浮点)数字还是字符串,结果都是数字。

换句话说,它产生了:

function(x) {
  if(x < 0) return Math.ceil(x);
  else return Math.floor(x);}

只有当x在-(231)和231-1.否则会发生溢出,数字将“环绕”。

这对于将函数的字符串参数转换为数字可能是有用的,但由于存在溢出的可能性,而且与非整数一起使用是不正确的,因此,除了“代码高尔夫球”之外,我不会那样使用它(E.在牺牲可读性和健壮性的情况下,毫无意义地从程序源代码中删除字节)。我会用+xNumber(x)相反。


这是不可能的

例如,数字-43.2是:

-43.210 = 111111111111111111111111110101012

作为一个有符号的(两个补码)32位二进制数。(JavaScript忽略了小数点之后的内容。)将BIT倒置给:

非-4310 = 000000000000000000000000001010102 = 4210

再倒转:

不是4210 = 111111111111111111111111110101012 = -4310

这与Math.floor(-43.2)在这个负数四舍五入为零,而不是远离它。(无论数字是正数还是负数,地板函数(等于-44)总是向下舍入下一个较低的整数。)


查看完整回答
反对 回复 2019-07-13
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

第一个~运算符强制操作数为整数(可能在将值强制为字符串或布尔值之后),然后将最低的31位反转。据官方说法,ECMAScript数字都是浮点数,但有些数字在SpiderMonkey引擎中被实现为31位整数。


您可以使用它将一个1元素数组转换为整数。浮点数是按照C规则转换的,即.小数部分的截断。


然后,第二个~运算符将位反转回来,因此您知道您将有一个整数。这与在条件语句中强制将值强制为布尔值不同,因为空对象{}的计算结果为true,而~{}的计算结果为false。


js>~~"yes"

0

js>~~3

3

js>~~"yes"

0

js>~~false

0

js>~~""

0

js>~~true

1

js>~~"3"

3

js>~~{}

0

js>~~{a:2}

0

js>~~[2]

2

js>~~[2,3]

0

js>~~{toString: function() {return 4}}

4

js>~~NaN

0

js>~~[4.5]

4

js>~~5.6

5

js>~~-5.6

-5


查看完整回答
反对 回复 2019-07-13
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

在ECMAScript 6中,相当于~~马蒂-特朗:

通过删除任何小数返回数字的整数部分。它不舍得任何数字。

Math.trunc(13.37)   // 13Math.trunc(42.84)   // 42Math.trunc(0.123)   //  0Math.trunc(-0.123)  
// -0Math.trunc("-1.123")// -1Math.trunc(NaN)     // NaNMath.trunc("foo")   // NaNMath.trunc()        // NaN

填充物:

function trunc(x) {
    return x < 0 ? Math.ceil(x) : Math.floor(x);}


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 364 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信