今天早上突然心血来潮决定用 ''和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;

  1. function toBinary (num) {
  2. //存储结果的数组
  3. var arr = [];
  4. var _8421 = [8,4,2,1];
  5. var fn = function(num){
  6. for(var i=0;i<_8421.length;i++) {
  7. var temp = num-_8421[i];
  8. if(temp == 0){
  9. arr.push(1);
  10. }else{
  11. arr.push(0);
  12. }
  13. }
  14. return arr;
  15. };
  16.  
  17. //返回fn得到返回的数组,并去除前面的0
  18. return fn(num).join('').replace(/^0+/,'');
  19. }
  20.  
  21. console.log(toBinary(1)); //
  22. console.log(toBinary(2)); //
  23. console.log(toBinary(3)); // ''
  24. console.log(toBinary(5)); // ''

2.上面的代码我们判断改数与8421中值的差值,如果等于0则用1表示,否则用0.但是问题来了:如果该数字不在8421中返回值就为空.想一想,除了等于0,还有大于0和小于0没有做判断.

考虑到这三种情况我们需要做:

  1: 如果差值为0,那么直接返回改数组.剩余的位用0补齐,

  2: 如果差值小于0,在用0表示改位的同时需要判断是否全部为0,如果是则返回该数组

  3: 如果差值大于0:那么在用1表示改位的同时,需要把差值再次循环判断(递归),且8421数组应从当前位截断

代码如下:

  

  1. function toBinary (num) {
  2. //存储结果的数组
  3. var arr = [];
  4. var _8421 = [8,4,2,1];
  5. //二进制位数
  6. var bit = _8421.length;
  7. //判断数组值是否全为0
  8. var isAll0 = function(arr){
  9. var flag = true;
  10. for(var i=0;i<bit;i++){
  11. if(arr[i] != 0){
  12. flag = false;
  13. continue;
  14. }
  15. }
  16. return flag;
  17. };
  18. var fn = function(num){
  19. for(var i=0;i<_8421.length;i++){
  20. //存放8421的临时值
  21. var temp = _8421[i];
  22. //如果传入的数字与8421数组中相减为0
  23. if(num-temp == 0){
  24. //该位用1表示
  25. arr.push(1);
  26. var length = arr.length;
  27. //如果当前输入length小于bit位则用0补齐
  28. if(length<bit){
  29. for(var c = 0;c<bit-length;c++){
  30. arr.push(0);
  31. }
  32. }
  33. return arr;
  34. }else{
  35. //如果小于0 则用0表示
  36. if(num-temp<0){
  37. arr.push(0);
  38. //当数组长度==二进制位数的时候判断是否全部为0
  39. if(arr.length==bit){
  40. if(isAll0(arr)){
  41. //返回该数组
  42. return arr;
  43. }
  44. }
  45. //如果大于0 则用1表示
  46. }else if(num-temp>0){
  47. arr.push(1);
  48. //并且把8421数组从当前位索引截断
  49. _8421.splice(0,i+1);
  50. //把改数与当前位的差递归
  51. return fn(num-temp);
  52. }
  53.  
  54. }
  55. }
  56. };
  57.  
  58. return fn(num).join('').replace(/^0+/,'')
  59. }
  60.  
  61. console.log(toBinary(1)); //
  62. console.log(toBinary(2)); //
  63. console.log(toBinary(3)); //
  64. console.log(toBinary(5)); //

3:通过判断三种情况.我们正确的得到了二进制数,但是还有问题;如果输入的值很大,而我们的数组只有8421.被固定死了.也就是说现在只能得到8+4+2+1 15以内的二进制值.如果大于这个值则无法计算.

一开始想的是,扩大这个数组.例如扩大到2048.但是问题又来了.大于2048+....+.的和又出问题了.于是我们需要一个函数动态创建8421码的数组:

  1. var create8421 = function(num){
  2. var tempArr = [1];
  3. while(tempArr[0]-num<0){
  4. //如果两数相减为负数
  5. //在数组第一位插入第二位的2倍值
  6. tempArr.unshift(tempArr[0]*2);
  7. }
  8. return tempArr;
  9.  
  10. };

这个函数接收一个num.并初始化一个tempArr=[1]作为8421的基准,然判断数组第一位和num的差值.如果小于0则向该数组第一位插入第二位2倍的数;这样即可得到一个由num控制大小的8421数组

最终代码如下:

  1. function toBinary (num) {
  2. var arr = [];
  3. //根据输入的数创建对应大小的8421数组
  4. var create8421 = function(){
  5. var tempArr = [1];
  6. while(tempArr[0]-num<0){
  7. //如果两数相减为负数
  8. //在数组第一位插入第二位的2倍值
  9. tempArr.unshift(tempArr[0]*2);
  10. }
  11. return tempArr;
  12.  
  13. };
  14. var _8421 = create8421();
  15. var bit = _8421.length;
  16. //判断数组值是否全为0
  17. var isAll0 = function(arr){
  18. var flag = true;
  19. for(var i=0;i<bit;i++){
  20. if(arr[i] != 0){
  21. flag = false;
  22. continue;
  23. }
  24. }
  25. return flag;
  26. };
  27. var fn = function(num){
  28. for(var i=0;i<_8421.length;i++){
  29. //存放8421的临时值
  30. var temp = _8421[i];
  31. //如果传入的数字与8421数组中相减为0
  32. if(num-temp == 0){
  33. //改位用1表示
  34. arr.push(1);
  35. var length = arr.length;
  36. //如果当前输入length小于bit位则用0补齐
  37. if(length<bit){
  38. for(var c = 0;c<bit-length;c++){
  39. arr.push(0);
  40. }
  41. }
  42. return arr;
  43. }else{
  44. //如果小于0 则用0表示
  45. if(num-temp<0){
  46. arr.push(0);
  47. if(arr.length==bit){
  48. //如果8位全是0则返回改数组
  49. if(isAll0(arr)){
  50. return arr;
  51. }
  52. }
  53. //如果大于0 则用1表示
  54. }else if(num-temp>0){
  55. arr.push(1);
  56. //并且把8421数组从当前位索引截断
  57. _8421.splice(0,i+1);
  58. //把改数与当前位的差递归
  59. return fn(num-temp);
  60. }
  61.  
  62. }
  63. }
  64. };
  65.  
  66. return fn(num).join('').replace(/^0+/,'')
  67.  
  68. }
  69.  
  70. console.log(toBinary(77)); //
  71. console.log(toBinary(156)); //
  72. console.log(toBinary(5369)); //
  73. console.log(toBinary(66666)); //
  74. 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进制的更多相关文章

  1. 16进制字符串和byte数组进行相互转换\将10进制转换为任意进制

    16进制字符串和byte数组进行相互转换 简介 1个byte对应8个bit,16进制使用4个bit,所以一个byte转成16进制,占用两位. JAVA代码 private static final c ...

  2. C++ 中 int 转string, 以及10进制转2进制

    感谢:http://blog.csdn.net/xiaofei2010/article/details/7434737 以及:http://www.cnblogs.com/nzbbody/p/3504 ...

  3. 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 ...

  4. javascript 10进制和64进制的转换

    原文:javascript 10进制和64进制的转换 function string10to64(number) { var chars = '0123456789abcdefghigklmnopqr ...

  5. c# 关于10进制和16进制转换以及显示

    直接举例说明: int i = 15;//一个10进制数 string txt = Convert.ToString(i,16);//将上面10进制以16进制形式显示为f string s = &qu ...

  6. python3 第十九章 - 写一个10进制转任意进制的函数

    我们先回忆下之前所学的进制转换的知识(详见:第十章),10进制转其它进制的方法是: 整数部分,除基取余,逆序排列 小数部分,乘基取整,顺序排列 负数,按绝对值处理 好,假设我们需要转化的数都是正整数, ...

  7. 10进制 VS 2进制

    10进制 VS 2进制 时间限制: 1 Sec  内存限制: 32 MB 题目描述 样例输出 623 #include<stdio.h> #include<string.h> ...

  8. js便签笔记(10) - 分享:json2.js源码解读笔记

    1. 如何理解“json” 首先应该意识到,json是一种数据转换格式,既然是个“格式”,就是个抽象的东西.它不是js对象,也不是字符串,它只是一种格式,一种规定而已. 这个格式规定了如何将js对象转 ...

  9. 题目1208:10进制 VS 2进制(进制转换以及大数保存问题)

    题目链接:http://ac.jobdu.com/problem.php?pid=1208 详细链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

随机推荐

  1. ubuntu下解决wireshark权限问题

    wireshark要监控eth0,但是必须要root权限才行.但是,直接用root运行程序是相当危险,也是非常不方便的. 解决方法如下: 1.添加wireshark用户组 sudo groupadd ...

  2. iOS 模拟器键盘弹出以及中文输入

    1.虚拟键盘的弹出与收起切换: 快捷键:command+shift+K 2.中文输入: Xcode 菜单项 --> Product --> Scheme --> Edit Schem ...

  3. MSIL 教程(三):类和异常处理(转)

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857771.html 续上文[翻译]MSIL 教程(二):数组.分支.循环.使用不安全代 ...

  4. linux硬链接和软链接的区别

    1.原理上: 硬链接(hard link):A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件 ...

  5. PowerPoint 打开文档发现.pptx中胡内容有问题

    一.问题的提出 有一个文件,在window 7操作系统中通过邮箱地址保存到本地,结果打开的时候出现[PowerPoint 打开文档发现 文件.pptx中胡内容有问题] 然后提示[如果您信任此演示文稿的 ...

  6. java nio 网络框架实现

    maven项目 https://github.com/solq360/common 链式编/解码 链路层链式处理 管道管理socket 多协议处理非常方便 仿netty NioEventLoop 单线 ...

  7. Linux下查看tcp连接数及状态

    netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ TIME_WAIT 8947FIN_WAIT1 15FIN_W ...

  8. Physical Based Shading in Unreal Engine 3

    Roughness = 0.1roughness = 0.4roughness = 0.7roughness = 0.999 以上的Fresnel 0° = {1.0,0.86.0.57}(PS: 近 ...

  9. 美了美了!22款精美的 iOS 应用程序图标模板

    22款制作精美的 iOS 应用程序图标设计作品,遵循图形设计的现代潮流,所有图标都非常了不起,给人惊喜.通过学习这些移动应用程序图标,设计人员可以提高他们的创作,使移动用户界面看起来更有趣和吸引人. ...

  10. 字符编码(ASCII,Unicode和UTF-8) 和 大小端

    本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”. 第1部分 ASCII,Unicode和UTF-8 介绍 1. ASCII码 ...