js用8421码实现10进制转2进制
今天早上突然心血来潮决定用 ''和js来撸一个进制转换.(纯属心血来潮,有兴趣的可以看看.)
我们知道,通过8421码.可以快速的得到一个10进制的2进制.如下图:

如上图所示:我们将10进制的 '10'转换成2进制,
10=8+2; 那么8421码下面的8和2用1表示,4和1用0表示;则可以得到1010;这个1010便是10的二进制数.是不是很简答呢?
再来一个栗子:


.
到这里你可能会疑问,那如果是大于15呢(8+4+2+1完全不够用啊)?
很简单啊,8421不够那就168421 再不够就 ......1024,512,256,128,64,32.....1 ;
OK,到此为止我们知道如果通过8421码得到一个数的2进制.那么 代码走起
======================================================================
1,若数字对应8421则用1表示,否则用0;
function toBinary (num) {
//存储结果的数组
var arr = [];
var _8421 = [8,4,2,1];
var fn = function(num){
for(var i=0;i<_8421.length;i++) {
var temp = num-_8421[i];
if(temp == 0){
arr.push(1);
}else{
arr.push(0);
}
}
return arr;
};
//返回fn得到返回的数组,并去除前面的0
return fn(num).join('').replace(/^0+/,'');
}
console.log(toBinary(1)); //
console.log(toBinary(2)); //
console.log(toBinary(3)); // ''
console.log(toBinary(5)); // ''
2.上面的代码我们判断改数与8421中值的差值,如果等于0则用1表示,否则用0.但是问题来了:如果该数字不在8421中返回值就为空.想一想,除了等于0,还有大于0和小于0没有做判断.
考虑到这三种情况我们需要做:
1: 如果差值为0,那么直接返回改数组.剩余的位用0补齐,
2: 如果差值小于0,在用0表示改位的同时需要判断是否全部为0,如果是则返回该数组
3: 如果差值大于0:那么在用1表示改位的同时,需要把差值再次循环判断(递归),且8421数组应从当前位截断
代码如下:
function toBinary (num) {
//存储结果的数组
var arr = [];
var _8421 = [8,4,2,1];
//二进制位数
var bit = _8421.length;
//判断数组值是否全为0
var isAll0 = function(arr){
var flag = true;
for(var i=0;i<bit;i++){
if(arr[i] != 0){
flag = false;
continue;
}
}
return flag;
};
var fn = function(num){
for(var i=0;i<_8421.length;i++){
//存放8421的临时值
var temp = _8421[i];
//如果传入的数字与8421数组中相减为0
if(num-temp == 0){
//该位用1表示
arr.push(1);
var length = arr.length;
//如果当前输入length小于bit位则用0补齐
if(length<bit){
for(var c = 0;c<bit-length;c++){
arr.push(0);
}
}
return arr;
}else{
//如果小于0 则用0表示
if(num-temp<0){
arr.push(0);
//当数组长度==二进制位数的时候判断是否全部为0
if(arr.length==bit){
if(isAll0(arr)){
//返回该数组
return arr;
}
}
//如果大于0 则用1表示
}else if(num-temp>0){
arr.push(1);
//并且把8421数组从当前位索引截断
_8421.splice(0,i+1);
//把改数与当前位的差递归
return fn(num-temp);
}
}
}
};
return fn(num).join('').replace(/^0+/,'')
}
console.log(toBinary(1)); //
console.log(toBinary(2)); //
console.log(toBinary(3)); //
console.log(toBinary(5)); //
3:通过判断三种情况.我们正确的得到了二进制数,但是还有问题;如果输入的值很大,而我们的数组只有8421.被固定死了.也就是说现在只能得到8+4+2+1 15以内的二进制值.如果大于这个值则无法计算.
一开始想的是,扩大这个数组.例如扩大到2048.但是问题又来了.大于2048+....+.的和又出问题了.于是我们需要一个函数动态创建8421码的数组:
var create8421 = function(num){
var tempArr = [1];
while(tempArr[0]-num<0){
//如果两数相减为负数
//在数组第一位插入第二位的2倍值
tempArr.unshift(tempArr[0]*2);
}
return tempArr;
};
这个函数接收一个num.并初始化一个tempArr=[1]作为8421的基准,然判断数组第一位和num的差值.如果小于0则向该数组第一位插入第二位2倍的数;这样即可得到一个由num控制大小的8421数组
最终代码如下:
function toBinary (num) {
var arr = [];
//根据输入的数创建对应大小的8421数组
var create8421 = function(){
var tempArr = [1];
while(tempArr[0]-num<0){
//如果两数相减为负数
//在数组第一位插入第二位的2倍值
tempArr.unshift(tempArr[0]*2);
}
return tempArr;
};
var _8421 = create8421();
var bit = _8421.length;
//判断数组值是否全为0
var isAll0 = function(arr){
var flag = true;
for(var i=0;i<bit;i++){
if(arr[i] != 0){
flag = false;
continue;
}
}
return flag;
};
var fn = function(num){
for(var i=0;i<_8421.length;i++){
//存放8421的临时值
var temp = _8421[i];
//如果传入的数字与8421数组中相减为0
if(num-temp == 0){
//改位用1表示
arr.push(1);
var length = arr.length;
//如果当前输入length小于bit位则用0补齐
if(length<bit){
for(var c = 0;c<bit-length;c++){
arr.push(0);
}
}
return arr;
}else{
//如果小于0 则用0表示
if(num-temp<0){
arr.push(0);
if(arr.length==bit){
//如果8位全是0则返回改数组
if(isAll0(arr)){
return arr;
}
}
//如果大于0 则用1表示
}else if(num-temp>0){
arr.push(1);
//并且把8421数组从当前位索引截断
_8421.splice(0,i+1);
//把改数与当前位的差递归
return fn(num-temp);
}
}
}
};
return fn(num).join('').replace(/^0+/,'')
}
console.log(toBinary(77)); //
console.log(toBinary(156)); //
console.log(toBinary(5369)); //
console.log(toBinary(66666)); //
console.log(toBinary(233333)); //
这样一个用'8421'码转换 进制的代码便完成了.
其实有个小问题:如果输入0的话直接给返回" ".原因是因为正则替换掉了0.来个正则大神讲解下:如果只有1一个0则保留0,否则替换由'0'开始的所有0;
代码写得有点粗糙.没有考虑太多.新手发文,求大神轻喷 = =#!
欢迎吐槽代码,指出错误.
<!--
作者:mgso
出处:http://www.cnblogs.com/mgso/p/6181095.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。谢谢合作。
-->
js用8421码实现10进制转2进制的更多相关文章
- 16进制字符串和byte数组进行相互转换\将10进制转换为任意进制
16进制字符串和byte数组进行相互转换 简介 1个byte对应8个bit,16进制使用4个bit,所以一个byte转成16进制,占用两位. JAVA代码 private static final c ...
- C++ 中 int 转string, 以及10进制转2进制
感谢:http://blog.csdn.net/xiaofei2010/article/details/7434737 以及:http://www.cnblogs.com/nzbbody/p/3504 ...
- python中2进制、10进制、16进制等之间的转换
10转2: bin(8) # '0b1000' 2转10: int( 10转16: hex(15) # '0xf' 16转10: int( 2进制和16进制中间通过转10进制可以相互转换 from b ...
- javascript 10进制和64进制的转换
原文:javascript 10进制和64进制的转换 function string10to64(number) { var chars = '0123456789abcdefghigklmnopqr ...
- c# 关于10进制和16进制转换以及显示
直接举例说明: int i = 15;//一个10进制数 string txt = Convert.ToString(i,16);//将上面10进制以16进制形式显示为f string s = &qu ...
- python3 第十九章 - 写一个10进制转任意进制的函数
我们先回忆下之前所学的进制转换的知识(详见:第十章),10进制转其它进制的方法是: 整数部分,除基取余,逆序排列 小数部分,乘基取整,顺序排列 负数,按绝对值处理 好,假设我们需要转化的数都是正整数, ...
- 10进制 VS 2进制
10进制 VS 2进制 时间限制: 1 Sec 内存限制: 32 MB 题目描述 样例输出 623 #include<stdio.h> #include<string.h> ...
- js便签笔记(10) - 分享:json2.js源码解读笔记
1. 如何理解“json” 首先应该意识到,json是一种数据转换格式,既然是个“格式”,就是个抽象的东西.它不是js对象,也不是字符串,它只是一种格式,一种规定而已. 这个格式规定了如何将js对象转 ...
- 题目1208:10进制 VS 2进制(进制转换以及大数保存问题)
题目链接:http://ac.jobdu.com/problem.php?pid=1208 详细链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
随机推荐
- IIS7 php wordpress 中文url 标签tag中文URL404解决方法
新建重写规则: <rule name="ChineseURL" stopProcessing="true"> <match url=" ...
- eclipse项目导入androidstudio
1.添加build.gradle buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tool ...
- ES6转ES5:Gulp+Babel
目标: ES6代码转成ES5 对转换后的ES5进行压缩 以上步骤自动监控执行 步骤: 1.安装插件 在命令行中定位到项目根目录 安装全局 Gulp npm install -g gulp 安装项目中使 ...
- vbox导入虚拟电脑网卡MAC问题
vbox导入虚拟电脑之后,需要"重新初始化所有网卡的MAC地址". centos需要做以下几步操作: 1.删除文件"/etc/udev/rules.d/70-persis ...
- Cannot find SS.INI file for user *** 解决方法
昨天还用的好好的VSS今天早上一来就提示: Cannot find SS.INI file for user *** 度娘了一下,好像都是说的: 1,vss\users\***\ 下无文件SS.IN ...
- [OpenCV] Feature Extraction
特征检测 特征描述 特征匹配 特征跟踪 “不读白不读,读了还想读” 的一本基础书 低层次特征提取 阈值方法 1. 边缘检测 一阶检测算子 二阶检测算子 相位一致性(频域) 2. 角点检测(局部特征提取 ...
- selenium webdriver (python) 第三版
感谢 感谢购买第二版的同学,谢谢你们对本人劳动成果的支持!也正是你们时常问我还出不出第三版了,也是你们的鼓励,让我继续学习整理本文档. 感谢乙醇前辈,第二版的文档是放在他的淘宝网站上卖的,感谢他的帮忙 ...
- Robot Framework自动化测试(二)---元素定位
说明: 不要误认为Robot framework 只是个web UI测试工具,更正确的理解Robot framework是个测试框架,之所以可以拿来做web UI层的自动化是国为我们加入了seleni ...
- python函数式编程
函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是“怎么干”,而函数函数式编程的思考方式是我要“干什么”. 至于函数式编程的特点暂不总结,我们直接拿例子来体会什么是函数 ...
- ShortcutMapper – 热门应用程序的可视化快捷键
ShortcutMapper 是一个流行应用程序的键盘快捷键映射.该应用程序使用 Ajax 调用来加载键盘和应用程序数据.首先,试图找到一个在线资源,其中列出了每个平台的所有应用程序快捷方式.然后你可 ...