快速的取整方法(~~)

为什么80%的码农都做不了架构师?>>>   hot3.png

最近看一篇js装逼小技巧————双波浪号的妙用(将内容转化为数字,或者小数取整),但是本身我的JavaScript水平比较低对其底层操作和其使用范围不甚了解;通过翻阅资料现进行简单的整理。 ###装逼技巧地址&截图### 地址

图片

###~~的本质### ~~被称为“双按位非”操作符。你通常可以使用它作为代替Math.trunc()的更快的方法。 一个按位非操作符~首先将输入input截取为32位,然后将其转换为-(input+1)。因此双按位非操作符将输入转换为-(-(input + 1)+1),使其成为一个趋向于0取整的好工具。对于数字的输入,它很像Math.trunc()。失败时返回0,这可能在解决Math.trunc()转换错误返回NaN时是一个很好的替代。

// 单个 ~
console.log(~1337)// -1338
// 数字输入
console.log(~~47.11)  // -> 47
console.`log`(~~1.9999) // -> 1
console.log(~~3)  // -> 3

然而, 尽管~~可能有更好的性能,有经验的程序员通常坚持使用Math.trunc()。要明白为什么,这里有一个关于此操作符的分析。 ###适用的情况### 当CPU资源很珍贵时

~~可能在各平台上都比Math.trunc()快,但是你应该在你所关心的所有平台上测试这种猜想。同样,你通常需要执行数百万这样的操作来看看在运行时有没有明显的影响。

当不需要关心代码清晰度时

如果你想迷惑其他人,或者想在minifier/uglifier时取得更大功效,这是一种相对廉价的方式。 ###禁用的情况### 当你的代码需要维护时

代码可读性始终是最重要的。无论你工作在一个团队,或是贡献给开源仓库,或是单飞。

当你忘记~~永远趋向于0时

新手程序员或许更关注~~的聪明之处,却忘记了“只去掉小数部分”的意义。这在将浮点数转换为数组索引或关联有序的值时很容易导致差一错误 ,这时明显需要一个不同的取整方法。 (代码可读性不高往往会导致此问题)

打个比方,如果你想得到离一个数“最近的整数”,你应该用Math.round()而不是~~,但是由于程序员的惰性和每次使用需要敲10个键的事实,人类的手指往往会战胜冷冷的逻辑,导致错误的结果。

相比之下,Math.xyz()(举例)函数的名字清楚的传达了它们的作用,减少了可能出现的意外的错误。

当处理大数时

因为~首先将数组转换为32位,~~的结果伪值在 ±2.15*10^12左右。如果你没有明确的检查输入值的范围,当转换的值最终与原始值有很大差距时,用户就可能触发未知的行为:

a = 2147483647.123  // 比32位最大正数,再多一点
console.log(~~a)// ->  2147483647 (ok)
a += 10000  // ->  2147493647.123 (ok)
console.log(~~a)// -> -2147483648 (huh?)

一个特别容易中招的地方是在处理Unix时间戳时(从1970年1月1日 00:00:00 UTC开始以秒测量)。一个快速获取的方法:

epoch_int = ~~(+new Date() / 1000) // Date() 以毫秒计量,所以我们缩小它 然而,当处理2038年1月19日 03:14:07 UTC 之后的时间戳时(有时称为Y2038 limit), 可怕的事情发生了:

// 2040年1月1日 00:00:00.123 UTC的时间戳
epoch = +new Date('2040-01-01') / 1000 + 0.123  // ->  2208988800.123
// 回到未来!
epoch_int = ~~epoch // -> -2085978496
console.log(new Date(epoch_int * 1000)) // ->  Wed Nov 25 1903 17:31:44 UTC

// 这很搞笑,让我们来取得正确结论

epoch_flr = Math.floor(epoch)   // ->  2208988800
console.log(new Date(epoch_flr * 1000)) // ->  Sun Jan 01 2040 00:00:00 UTC

当原始输入的数据类型不确定时

因为~~可以将任何非数字类型转换为0:

console.log(~~[])   // -> 0
console.log(~~NaN)  // -> 0
console.log(~~null) // -> 0

一些程序员将其看作适当输入验证的替代品。然而,这将导致奇怪的逻辑问题,因此你不能辨别违法输入还是真正的0。因此这并不推荐。 当很多人认为~~X == Math.floor(X)时

很多人由于很多原因错误的把”双按位非”等同于Math.floor()。如果你不能准确地使用它,最终你很有可能会滥用它。

另一些人很细心的注意正数使用Math.floor()而负数使用Math.ceil(),但这又强制你在处理它的时候需要停下来想一想你处理的数是什么值。这又违背了使用~~快捷无陷阱的目的。

###结论###

  1. 谨慎使用。
  2. 在应用前检查值。
  3. 仔细记录被转化值的相关假设。
  4. 审查代码至少处理:
  • 逻辑错误,不合法的输入作为合法的0传入其他代码模块
  • 输入转换后范围错误
  • 错误的舍入方向导致差一错误

转载于:https://my.oschina.net/bbhan/blog/1498466

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git log友好显示

查看commit 提交日志 $ git log $git log --prettyoneline $git reflog 显示所有提交记录,包括已经回退的提交,如图:提交了abc 和 bb 然后回退到 abc   $git log 只显示abc提交 可以使用 $git reset --hard commit号 回退到bb git reflog…

jprofiler_windows-x64_9_1注册码

L-Larry_Lau163.com#5481-ucjn4a16rvd98#6038 L-Larry_Lau163.com#36573-fdkscp15axjj6#25257 转载于:https://www.cnblogs.com/sprinng/p/5104507.html

南理工计算机技术专业学位,南京理工大学计算机技术(专业学位)考研难吗

很多考生在准备南京理工大学计算机技术(专业学位)考研难吗?是考研报考的时候都会产生这样的疑问:这个专业的研究生好吗?适合我吗?对我以后的人生和职业会有帮助吗?考生在准备南京理工大学计算机技术(专业学位)专业考研…

《分布式系统:概念与设计》一2.3.2 体系结构模式

2.3.2 体系结构模式 体系结构模式构建在上述讨论过的相对原始的体系结构元素之上,提供组合的、重复出现的结构,这些结构在给定的环境中能运行良好。它们未必是完整的解决方案,但当与其他模式组合时,它们会更好地引导设计者给出一…

javascript sort()实现元素json对象的排序

看以下代码: var s [ { name: "Robin Van PurseStrings", age: 30 } ,{ name: "Theo Walcott", age: 24 } ,{ name: "Bacary Sagna", age: 28 } ].sort(function(obj1, obj2) {// 实现增序排列:前者的 age 小于后者…

html5手机签名,html5手写签名

var canvas, board;canvas document.getElementById(myCanvas);canvas.height 300;canvas.width 400;board canvas.getContext(2d);board.lineWidth 1; //设置画笔粗细board.strokeStyle "#f00";board.lineJoin "round"; //设置画笔轨迹基于圆点拼接…

调查:Java程序员最伤心,C++程序员最年老

说起我们对编程世界现有的刻板印象,你一定听说过类似于没有人喜欢用Java编码或者使用C 都是老人家,等等这样的话。为了分析这些刻板印象背后的真相,Trestle Technology的数据工程师写了一个工具。 不知道你有没有听说过微软的Project Oxford&…

mysql一些写常用命令

参见pcttcnc2007博客腾飞 1.mysql的status信息命令: mysql> show global status; 2.可以列出mysql服务器运行各种状态值,另外,查询mysql服务器配置信息语句: mysql> show variables; 3.连接数 经 常会遇见”mysql: error 1040: too man…

计算机不小心删除怎么找回桌面,如何将桌面上误删的文件找回

在如今工作电脑化的趋势下,用户都会在桌面上创建各种各样的文件等,这些文件都是需要在工作中经常要进行各种操作的重要文件,那么频繁的操作也会出现各种的意外情况等,如果不小心删除了重要的文件该怎么恢复呢?想要恢复…

《编程原本 》一3.3 程序变换

3.3 程序变换 power0是有关算法的一个令人满意的实现,它适用于运算的代价高于函数递归调用开销的情况.本节要推导出一个迭代算法,它执行运算的次数和power0一样.这里将要做一系列程序变换,这些变换也可以用在其他许多情况中.5 在本书后面的部分,通常将只给出算法的最终版本或几…

Effective C++ .07 virtual析构函数的提供

主要讲了, 1. virtual析构函数的作用与调用顺序 2. 使用时机,并不是使用了继承就要把基类的析构函数变为虚函数(virtual),只有当用于多态目的时才进行一个virtual析构函数的定义。 3. 不要继承那些没有将析构函数定义为…

OnClickListener冲突的问题

OnClickListener冲突的问题 (2011-11-26 15:28:27) 转载▼标签: 杂谈 分类: android学习记录 import anfroid.view.View.OnClickListenerimport anfroid.content.DialogInterface.OnClickListener 这两个东西要同时用的话,要使用以下方式&…

html 响应式 同一行,一行CSS实现各种响应式元素 – Fluidity

一行CSS实现各种响应式元素 – Fluidity3月 31, 2014评论SponsorFLUIDITY是一个极微小的CSS样式表,压缩版只有一行代码,大小只有115个字节,它能实现图像、文本、Canvas、Table表格以及iFrame框架的响应式功能。好用且实用!这个响应…

玩C一定用得到的19款Java开源Web爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 今天将为…

一元二次方程

转载于:https://www.cnblogs.com/569114a/p/4179164.html

cookie html5,HTML5——存储(cookie、localStorage、sessionStorage)的区别

cookie本来用于客户端和服务端通信,但是因为它有本地存储的功能,于是被“借用”了。使用方法document.cookie 获取和修改即可缺点存储量太少,只有4kb所有http请求都带着,会影响获取资源的效率。API简单,需要封装才能使…

数据中心存在不当投资吗?

不正当的投资是一种危害:在一些项目建设中,投入大量的资金是错误的,因为这些项目的需求是不可持续的或高估的。那么数据中心属于这一类吗? 投资不当的问题 不当投资会与经济的繁荣与萧条齐头并进。例如,抑制按揭贷款利率可能会导…

问题:循环元素,被选中元素个数,全选

一段时间不写js都有点忘记了&#xff0c;这里看几个常见的js&#xff0c;涉及到循环&#xff0c;计算元素个数&#xff0c;checkbox选中等问题&#xff0c;首先是html元素 <div class"content border p05"><div><input type"checkbox" id&q…

LeetCodeOJ. String to Integer (atoi)

试题请參见: https://oj.leetcode.com/problems/string-to-integer-atoi/ 题目概述 Implement atoi to convert a string to an integer.Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the…

html如何设置滚动动画,JavaScript 实现页面滚动动画

在做前端 UI 效果时&#xff0c;让元素根据滚动位置实现动画效果是一个非常流行的设计&#xff0c;通常我们会使用第三方插件或库来实现。在本教程中&#xff0c;我将教大家使用纯 JavaScript 和 CSS 来实现。先预览一下实现的效果&#xff1a;我们使用 CSS 来实现动画&#xf…