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

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

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

翻翻过去那场雪 2019-08-03 07:03:51
今天我正在看一个网络游戏物理图书馆,偶然发现了~操作员。我知道,一个~是一个按位计算的不,这会使~一个不,这将返回相同的价值,不是吗?
查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

它删除小数点之后的所有内容,因为按位运算符隐式地将其操作数转换为有符号的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-08-05
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

第一个~运算符强制操作数为整数(可能在将值强制为字符串或布尔值之后),然后将最低的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-08-05
?
手掌心

TA贡献1942条经验 获得超3个赞

在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-08-05
  • 3 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号