JS如何处理超过32位的整数的位运算
这个问题是已经毕业的学员李佳问到的,本想在网上查一下给他个答案省事.转念一想,如果网上如果他能在网上查到看的明白的方案应该不至于来问我.索性自己给他解一解.因为貌似这个问题还是有点意思的.
首先,要知道为什么这个问题会成为一个问题.这里就不得不说说JS当中坑爹的位运算规则.
我们知道JS是一种弱类型的脚本语言,所有的数值无论是整数还是小数,其实都是按照64为位的浮点形式存储.然而当两个整数在进行位运算时,却又会自动转化为32位的有符号整数.这才导致了这个蛋疼的问题.
解决这个问题以前我们先来考虑这样一件事情,如果在你面前有一缸水,但是你只有一个32L的桶,现在你想取50L水,要怎样取. 跑两趟,对吗?两趟不行,三趟种可以吧.
计算机是为人类服务的,这种思路一定可以行的通.
比如现在有一个超级大的数,我们假定它是0xf ffff ffff,好了九个F够了,超过32位的就行.如果我们要拿着这个数跟0xf000 000f异或.我们希望得到的结果是0x f 0fff fff0对吗? 可是理想很丰满,现实却是残酷的,因为当你直接拿这两个数异或之后,发现结果是 0x 0fff fff0, 因为转化为32位的整数时,那个超标的数的高字节部分被截掉了,坑爹啊?
回顾我刚才讲到的分趟原理, 既然JS每次最多只能处理32位的位运算,那么能不能分段来处理呢?很肯定的告诉你,可以.
那么接下来的问题就是:
1,分几段,怎么分
2,分出来的数据如何处理
3,分段处理的数据如何整合
结合上面的数据来分析,0xf ffff ffff总有效的数据实际上只存在于后面的9个字节中,而JS的位运算最多可以处理4个字节的数据,只需要将一个字节抽离出来单独处理,剩下的部分作为另一段处理即可.
浏览器有问题,已保存就崩,直接丢代码了
var longN = 0xfffffffff; //超长数
var shortN = 0x0ffffff0; //标准数
var tool = 0x000000ff; //用于截取指定位置(最低位字节)数据的工具数var t_long = longN & tool; //保存超长数最低字节数据
var t_short = shortN & tool; //保存标准书最低字节数据
var t_r = t_long ^ t_short; //保存最低字节数据异或结果
var offset = Math.pow(2,tool.toString(16).length * 4);
longN = Math.floor(longN / offset); //将超长数已处理的数据部分移出,目的是将32位以外的那一个字节移进来
//!!!注意,这里不要使用parseInt,因为会使64位转为32位
shortN = Math.floor(shortN / offset); //同上
var t_h = longN ^ shortN; //保存剩余未处理的数据异或的结果
t_h *= offset; //将结果左移回到原来的对应位
var result = t_h + t_r //整合结果
console.log(result.toString(16)); //ff000000f
上面的代码只是一个例子,体现的是一种思路,但还不是一个完整健壮的解决方案,因为更多位的数上面这个是无法实现的,而且因为32的数是有符号的,所以在分两段处理时,其中一段最大只能到31位,所以最稳妥的方法应该是根据两个操作数中长度最大的数据灵活拆分. todo……
JS如何处理超过32位的整数的位运算相关推荐
- c#设置或者获取byte(字节、8位二进制整数)某位的的值的代码
作者:菊花古剑和酒 转自:http://blog.csdn.net/jefftian2008/article/details/8661723 [csharp] view plaincopy 代码 #r ...
- 分治算法经典问题---大整数乘法(1~32位大整数乘法)C++
大整数乘法 大整数乘法(1~32位大整数乘法) 分治的思想 实验题目及要求(大整数乘法) 算法分析(result=m4*10^2^+(m2+m3)*10^n/2^+m1) 算法分析 代码 源文件 ma ...
- 一个IP地址是由四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。如果输入的数字不足32位或超过32位或输入的数字中有非0和1的数字时输出“
题目 一个IP地址是由四个字节(每个字节8个位)的二进制码组成.请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出.如果输入的数字不足32位或超过32位或输入的数字中有非0和1的数 ...
- input js number 整数_数字千分位处理,number.js,js保留两位,整数强制保留两位小数...
杨龙飞 杨龙飞 杨龙飞 杨龙飞 杨龙飞 杨龙飞 官方文档:https://www.customd.com/articles/14/jquery-number-format-redux 1.千分位 $. ...
- 点分十进制字符串IP和32位int整数互转Java实现
点分十进制字符串IP和32位int整数互转Java实现 比较简单基础的题,可记录和回顾基础. IPv4(4*8)和32位的int整数刚好可以11映射,但由于int整数是有符号的,所以不能直接通过划分为 ...
- 有一个字长32位的浮点数符号位1位_边缘计算专题:(二)别看只有0和1,数学不好的勿进!...
一.二进制数与信息表示 1.概述 二进制的由来 德国最重要的自然科学家.数学家.物理学家.历史学家和哲学家,一个举世罕见的科学天才,和牛顿同为微积分的创建人--莱布尼兹. 在数学史上,西方史学家认为他 ...
- [转载]32位系统与64位系统的区别(整合三篇写的比较好的文章)
来源:鲁大师 作者:节能降温 连接:http://www.ludashi.com/html/20101028/1107.html 简单的说x86代表32位操作系统 x64代表64位操作系统.如果你的C ...
- c语言的程序是32位还是64位,在C语言中,对于32位计算机和64位计算机,long的大小是多少?...
本问题已经有最佳答案,请猛点这里访问. 对于32位平台,C中的long的大小为4字节,而对于64位平台,为8字节是否正确? 通常,但不一定. 如果要使用固定大小的类型,请使用int32_t或int64 ...
- oracle 判断数字是否为整数,怎么判断JS中一个数字是否为整数?
怎么判断JS中一个数字是否为整数? 面试的时候遇到的问题,然后小疯回去查就几种方法,姑且一看,请多指正. 方法一: var ss =$("#ss").val(); var sss ...
最新文章
- 台积电2nm与3nm制程
- UIActivityViewController使用
- 发现一款3D 打印的pcDuino外壳
- SpringBoot-(6)-日志SLF4j
- Quartz-Spring集成Quartz通过XML配置的方式
- 一个DataTable赋值给另一个
- python模块之lib2to3(py2转py3自动化工具)
- 2台电脑一根网线传文件_Iphone 和PC如何共享文件
- 【codevs2421】【BZOJ1858】序列操作,线段树
- 瑞星09年第一季度安全报告:8亿网民遭木马攻击
- 学习 尚硅谷_宋红康_第2章_Java基本语法(下):程序流程控制超详细课件
- C#JSON格式数据的转换
- 面向法务编程|如何对接支付宝新产品满足法务要求:助力法务反洗钱反诈骗
- 应该将composer.lock致力于版本控制吗?
- 阿里云IoT | HaaS开源百校科技助力计划 —— 开源大使招募
- 游戏辅助小助手框架构想
- tf.extract_image_patches
- 干货!如何在SCI论文中转述和总结别人的论文和成果
- 关于搜索引擎及其开发
- 白话——海明校验码及编码过程