Math.abs(~2018)

  某前端群的入门问题长姿势了,一个简单的入门问题却引发了我的思考,深深的体会到自己在学习前端技术的同时忽略遗忘了一些计算机的基础知识。

  对于 JS Math对象没什么可说的, Math.abs(x)指的是返回一个数的绝对值,而解题关键在“~2018”,乍一看,这是什么意思,不会是“-2018”符号打错了吧?细思一下才恍然大悟,这是取反操作符,故取相反数得结果为-2018,Math.abs(-2018) 即2018,大功告成!可是,输入进去发现,What!错误!Why!

  首先,取反操作是按位取反,而不是取相反数,即把数据的二进制数中0变1,1变0;

  然后,要考虑到计算机中数据的存储是二进制数据,以补码的形式存在;

此处,我们要把2018转化为二进制数,然后取反之后在转化为十进制数吗?显然这对于2018这么大的数很麻烦,不如我们分析下有什么规律可循。

举个栗子:

var x = 10;

在计算机中一个整型数4字节,1字节8位,所以数字10在计算机中存储占32位,即

00000000 00000000 00000000 00001010,

按位取反,得

11111111 11111111 11111111 11110101,

这个二进制数据就是“~10”,最高位是1表示它是个负数,那么我们如何转化为十制数呢?

这里又涉及到了负数在计算机里的存储问题,计算机里,负数以其正值的补码形式存在。

再举个例子:

-10 ,二进制表示为

10000000 00000000 00000000 00001010

原码,取其绝对值也就是10,即

00000000 00000000 00000000 00001010

反码,按位取反,得

11111111 11111111 11111111 11110101

补码,即将反码加1,得

11111111 11111111 11111111 11110110

至此,我们得到了计算机中-10的二进制存储形式。

然后我们再回到上一个问题,我们怎么根据计算机中的补码得到这个负数呢?

我们可以按原路返回,就是将计算机中存储的二进制补码减1,然后取反,再得到原码,换成相应负数即可,不过这样有点麻烦,因为涉及到了减法操作。

另一种方法,将负数的补码先取反,然后加1,最高位置换为1即可。

对于~10,在计算机中存储为

11111111 11111111 11111111 11110101   (这是10取反的结果,但却是未知数X的补码形式)

先取反,得

00000000 00000000 00000000 00001010   (此处,再次取反,返回10)

再加1,得

00000000 00000000 00000000 00001011   (10+1得11)

最高位变1,即

10000000 00000000 00000000 00001011   (取相反数即-11)

结果是“-11”

由此我们可以看出规律:“~x”的结果为“-(x+1)”

所以“~2018”就等于“-2019”,Math.abs(-2019)即2019!!

Math.abs(~2018),掌握规律即可!的更多相关文章

  1. Math.abs(~2018),掌握规律!

    Math.abs(~2018) 这要用到一些计算机的基础知识. Math.abs(x)指的是返回一个数的绝对值,而关键在"~2018",这是取反操作符,故取相反数得结果为-2018 ...

  2. Math.abs(~2018) —— 入群问答题

    这道题的关键点在于对位操作符“~”的理解,以及内部的具体实现(设计到补码) 最后的结果是:2019 参考文章: http://www.w3school.com.cn/js/pro_js_operato ...

  3. Math.abs()方法 取绝对值

    定义和用法 abs() 方法可返回数的绝对值. 语法 Math.abs(x) 参数 描述 x 必需.必须是一个数值. 返回值 x 的绝对值. 实例 在本例中,我将取得正数和负数的绝对值: <sc ...

  4. 返回绝对值--Math.Abs 方法

    Math.abs()  返回指定数字的绝对值.

  5. Java toBinaryString()函数探究及Math.abs(-2147483648)=-2147483648原理探究

    toBinaryString()函数 public class Customer { public static void main(String[] args) { int m=-8; System ...

  6. Math.abs(~2020) 按位取反后的绝对值是多少 2021, 按位取反后,比正数多1

    Math.abs(~2020)  按位取反后的绝对值是多少 2021, 按位取反后,比正数多1 int 值的取值 范围:   -128 ---  127   之间, 0000 0000     按位取 ...

  7. Math.abs为Integer.Min_VALUE返回错误的值

      Math.abs为Integer.Min_VALUE返回错误的值 这段代码: System.out.println(Math.abs(Integer.MIN_VALUE)); 回报-2147483 ...

  8. java中Math.abs(-2147483648)的返回值应该是什么?

    我觉得这是一个非常有意思的问题,Math.abs(-2147483648)的返回值应该是什么? java计算结果 为什么没有得到正数结果呢? 首先我们先看下java区分整数正负的原理.在二进制的情况下 ...

  9. java中常用到的math方法(Math.PI、Math.random()、Math.abs(double)、Math.floor(double)、Math.ceil(double)、Math.round(double))

    public class MathDemo { public static void main(String args[]){ /** * abs求绝对值 */ System.out.println( ...

随机推荐

  1. python调用zabbix接口实现Action配置

    要写这篇博客其实我的内心是纠结的,老实说,我对zabbix的了解实在不多.但新公司的需求不容置疑,当我顶着有两个头大的脑袋懵懵转入运维领域时,面前摆着两百多组.上千台机器等着写入zabbix监控的需求 ...

  2. Code First Migrations 数据迁移小记

    用了codefirst后一个很大的问题就是代码中的属性字段与数据库中表的同步问题,删掉数据库重新生成当然可以解决,不过数据就丢失了(当然通过代码中初始化数据库添加数据也可以解决,初始化的任务可以通过重 ...

  3. 即时聊天IM之三 XMPP协议客户端库的和Android端框架概述

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com smack ...

  4. FileFilter 遍历某个目录下文件名含有某个字符的文件

    由于IIS版本的升级,造成了文件名中含有“+”的特殊字符的文件(多数是图片)在网页中不能被访问,于是必须查找当前目录下含有多少这样的文件,从而制定最佳的解决方案. 废话少说,直接上核心代码: publ ...

  5. 安卓xml文件中常见的问题

    1.EditText显示不完全

  6. c#实现远程操作svn

    /// <summary> /// 本地svn服务器地址 /// </summary> private static string localSVN = Configurati ...

  7. WCF初探-25:WCF中使用XmlSerializer类

    前言 在上一篇WCF序列化和反序列化中,文章介绍了WCF序列化和反序列化的机制,虽然WCF针对序列化提供了默认的DataContractSerializer序列化引擎,但是WCF还支持其他的序列化引擎 ...

  8. CSS入门

    CSS,层叠样式表,是对web页面显示效果进行控制的一套标准.当页面的内容受多种样式控制,将会按照一定的顺序处理.CSS的作用:(1)将网页的内容结构和格式控制分开.(2)可以精确控制页面的所有元素. ...

  9. php_html转译符号

    1.双引号 /" 或者 " 2.单引号 ' > 4. & &

  10. Emoji表情符号录入MySQL数据库失败解决

    让MySQL支持Emoji表情,涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集. utf8mb4和utf8到底有什么区别呢?原来以往的mysql的utf8一个字符最多3字节, ...