Math.abs(~2018),掌握规律!
Math.abs(~2018)
这要用到一些计算机的基础知识。
Math.abs(x)指的是返回一个数的绝对值,而关键在“~2018”,这是取反操作符,故取相反数得结果为-2018,Math.abs(-2018) 即2018,大功告成?结果,输入发现,错误!为什么?
首先,取反操作是按位取反,而不是取相反数,即把数据的二进制数中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),掌握规律!的更多相关文章
- Math.abs(~2018),掌握规律即可!
Math.abs(~2018) 某前端群的入门问题长姿势了,一个简单的入门问题却引发了我的思考,深深的体会到自己在学习前端技术的同时忽略遗忘了一些计算机的基础知识. 对于 JS Math对象没什么可说 ...
- Math.abs(~2018) —— 入群问答题
这道题的关键点在于对位操作符“~”的理解,以及内部的具体实现(设计到补码) 最后的结果是:2019 参考文章: http://www.w3school.com.cn/js/pro_js_operato ...
- Math.abs()方法 取绝对值
定义和用法 abs() 方法可返回数的绝对值. 语法 Math.abs(x) 参数 描述 x 必需.必须是一个数值. 返回值 x 的绝对值. 实例 在本例中,我将取得正数和负数的绝对值: <sc ...
- 返回绝对值--Math.Abs 方法
Math.abs() 返回指定数字的绝对值.
- Java toBinaryString()函数探究及Math.abs(-2147483648)=-2147483648原理探究
toBinaryString()函数 public class Customer { public static void main(String[] args) { int m=-8; System ...
- Math.abs(~2020) 按位取反后的绝对值是多少 2021, 按位取反后,比正数多1
Math.abs(~2020) 按位取反后的绝对值是多少 2021, 按位取反后,比正数多1 int 值的取值 范围: -128 --- 127 之间, 0000 0000 按位取 ...
- Math.abs为Integer.Min_VALUE返回错误的值
Math.abs为Integer.Min_VALUE返回错误的值 这段代码: System.out.println(Math.abs(Integer.MIN_VALUE)); 回报-2147483 ...
- java中Math.abs(-2147483648)的返回值应该是什么?
我觉得这是一个非常有意思的问题,Math.abs(-2147483648)的返回值应该是什么? java计算结果 为什么没有得到正数结果呢? 首先我们先看下java区分整数正负的原理.在二进制的情况下 ...
- 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( ...
随机推荐
- Thrift之TProtocol系列TBinaryProtocol解析
首先看一下Thrift的整体架构,如下图: 如图所示,黄色部分是用户实现的业务逻辑,褐色部分是根据thrift定义的服务接口描述文件生成的客户端和服务器端代码框架(前篇2中已分析了thrift ser ...
- sql语句添加删除外键及其约束
--删除外键 ALTER TABLE t_base_role_module DROP CONSTRAINT fk_t_base_role_module_t_base_defined_url; --增加 ...
- C# 获取ListView中选中行中对应的列数据
C# 获取ListView中选中行中对应的列数据 ) { ListView.SelectedIndexCollection c = MediaList.SelectedIndices; ]].SubI ...
- 利用JS判断浏览器种类
现在浏览器很多,写代码的时候常常存在兼容性问题,所以判断用户使用的浏览器很重要.userAgent带有浏览器的种类及版本号等信息,所以可以通过userAgent属性来判断.一些冷门的浏览器,可以通过打 ...
- nodejs爬虫笔记(四)---利用nightmare解决加载更多问题
目标: 解决页面加载更多问题.笔记三中,我们只爬取到网页的部分信息,而点击加载更多后的页面内容是没有提取到的.开始我的想法是找到加载更多的数据接口(可参照:http://www.jianshu.com ...
- awk中引用shell变量执行替换的脚本
遇到问题: 现在有两个脚本,我想 将file1中的内容按file2来匹配 [root@154 home]# cat file1 3-1-1 POTV=1,POTA=0,POTP=2 1-4-76 PO ...
- JavaSE基础篇—MySQL三大范式—数据库设计规范
1.概 念 范式是一种符合设计要求的总结,要想设计一个结构合理的关系型数据库,必须满足一定的范式.各个范式是以此嵌套包含的,范式越高,设计等级越高,在现实设计中也越难实现,一般数据库只要打 ...
- c# excel print 打印 将所有列调整为一页
excel有时候列数比较多,行数也比较多,转换成xps文档的时候,一般是通过打印来实现. 由于打印的范围限制,所以会出现本来在一行的数据,由于列数比较多,溢出范围,被打印到两页了. 为解决这个问题,需 ...
- web项目,ftl文件中的路径引入问题
路径问题的引入方式:绝对路径.相对路径 区别如图: =================================================
- python 3.x 爬虫基础---http headers详解
前言 上一篇文章 python 爬虫入门案例----爬取某站上海租房图片 中有对headers的讲解,可能是对爬虫了解的不够深刻,所以老觉得这是一项特别简单的技术,也可能是简单所以网上对爬虫系统的文档 ...