16进制转char_谈谈进制换算

16进制转char_谈谈进制换算
10 种⼈,⼀种是懂⼆进制的,另⼀种是不懂的 ——段⼦
世界上有 10
⼤学⾥像咱们要学到这个(虽然我觉得学了也没意义吧),和基础数学数论、基本算法结构有关系,既然这样,不如敞开讲下我之前的见闻。
转子气体流量计这篇⽂章是写给没有太多(⼆)进制相关知识的⼈的,不要弄个懂电⼦的⼈来看,害怕……
进制换算可以说只是⼈类⾥存在的问题,记得蹩脚的罗马数字(就是 II IV 这些加减乘除都⽤到的⼤混乱数值[1])吗?它是影响到你的处进制换算可以说只是⼈类⾥存在的问题
理能⼒的。
进制只是⼀种表⽰法嘛,数值说实在的还是 加减乘除余(+-*/%)、⼤⼩相等性(><, ==)判断,像⼆进制位运算 (a bitwiseOr b) 就等于抽象的(a+b) ,机器⾥⼀般是补码,这个没学过不讲[2]。
下⽂k表⽰数位编号(以0始从右数)、a*b表⽰
n**k 表⽰
为啥有这个问题
进制就是位置记数法
位置记数法,因为它的简单性(⽐如长的数肯定⼤、进位借位⽅便)被认作唯⼀的数值形式[3]。
在⼈类阅读习惯和⼤端(big endian)字节序⾥,前⾯即左端的数位占更⼤权重,它的“1”会表⽰更⼤的值。自动擦鞋机
与这个相关的数学符号是
隧道式搪瓷烧结炉和
⾸先说计算机怎么算,毕竟它的⽅法死板但接近“表⽰问题”的本质。
读取到抽象数值(『值』和其表⽰法没有关系,只提供加乘法、⽐较的这些操作):
int atoi(char* s) {
int accum = 0;
for (char c=*s; s!='00'; s++) { accum = accum*10+(c-'0'); }
return accum;
}
然后是输出:
#include <math.h>
char* itoa(int n) {
int size = (int)ceil(log10()); // 算⼗进制位数,要预先在系统堆分配定长度字符数组,可能不准确。
char* out = malloc(sizeof(char) * (size+1/*'00'*/)); // 分配 (size+1) ⼤⼩的字符(char) 数组
int i = size-1; // 字符串输出数位号,先 mod(%) 下来的是低位所以从右数。
while (n != 0) { out[i] = '0'+(n & 10); n /= 10; i -= 1; } // 重复若n不是0,右输出(n取余以10);n=n除10。
}
上⾯的代码是给相关专业的⼈看的(也⽤到了重赋值⼦程序参数的不良写法 ⼊"C"随俗),也不太好给所有⼈解释,从0编号的数组的末引数是 (size -1) 以及C字符串是以 '00' 结尾的char数组/内存⽚指针 这样的细节。
⽽且上⾯俩都不处理负数,知道数学弄啥有『定义域』『验证变形/组合有效性』吗?它解决的就是程序的运⾏时错误。itoa程序在 n<0的时候会陷⼊⽆限循环,从0前递减永远到不了0[4]。
(要实例⼲货的直接翻下⼀节)
毕竟咱也不是弄算法可视化的,输出循环变量变动表什么的就免了。(要实例⼲货的直接翻下⼀节)
公式不好看吧(也不太严谨,准确说是吓唬你们的)?(0~n的位长度)去求和,【i】量位值=基数乘⽅i;(n/位值取余以基数)乘位值。其中,常数基数=10。这样的意思。
好吧,其实真的公式是这个:
啊不对,其实这也是吓唬⼈的。
128=1+2+8。最讨厌数学公式了……
但是你仍然不相信它能⽤?那就⽐如
先明⽩它编码数值的⽅式。
先明⽩它编码数值的⽅式
这时候你就会发现
除了 2、8、16 (+A~F) ,任何进制都可能有,⽐如说 base64 编码算法实际上就是⽤ 基数=64,以 4 个字节表⽰ 3 字节的内容。
此外,⾮2倍数的进制也是可以与2、8、16进制互化的,位置计数法只是⼀种数制、表⽰法⽽已
四则和⼤⼩⽐
位置计数法只是⼀种数制、表⽰法⽽已,关键在于其实现的四则和⼤⼩⽐
较(属偏序关系)操作,除了『进制』,罗马数字也是数值的实现。
那么⼈类怎么算
对于⼈类就必须使⽤各种“计算技巧”了,⽐如说预先打好结果表如 2**4=16; 2**8=256 什么的,具体怎么算?
因为是从进制数到进制数(都是位置记数法,你也不会 itoa(atoi(n)) 这样⿇烦),
假设基数
是不同⽅法。总的来说前者是位合并(稍后有⼆与⼗六进制的快速换算法因为
是不同⽅法
[5]),后者是位溢出。
如果⽬标是⼗进制,因为咱⽤的对照表是⾄⼗进制的,且会⽤⼗进制⼿算,只⽤求和每位;但是不管是合并还是溢出,这⾥都有两种⽅法累积法、打表法。累积法⼀般是计算机使⽤,打表(即列表)就是靠求和/最⼤
——累积法、打表法
依此类推,把四则操作数⾥2换成其基数。
精⼒关系,只给 2和10、2和16 的例⼦了。 16和10 之类的依此类推,把四则操作数⾥2换成其基数。
2到10(读取)
例如, 101010、11111010、1000001000、1101001111101010
累积法:
原理类似 ((((((((((1*2)+0)*2)+1)*2)+0)*2)+1)*2)+0)==42
⼼算下试试,这个只⽤你记住⼀个数注意下最开始有、最后没 的 *2以及中间的 +n,你会发现数位们是按左右顺序出现的,别嫌⿇烦!⼼算下试试,这个只⽤你记住⼀个数字。
事进制2读(:⽂) 为
事读位(:字) = 若此字是'1',1。否则,0。
变数 n = 读位(此⽂[0])
对此⽂[1~数略] ⾥的,
n = n*2+读位(它)。
回n
看到 n=n*2+(d*2**k) (其中d数位2**k位置权重)了吗?最后⼀个数是加上的,累加数可以从数位下标[0]开始,也可以直接以0起始⽽
把[0]累加,试试吧。
⽐如 111010,记住1*2 ,+1乘2 ,+1乘2,+0乘2,+1乘2,+0。 得 58 。(第2⾄4步各得6、14、28)
打表法:
下⾯是
k2**k
01
12
24
38
416
532
664
7128
8256
9512
只需要求和有1的位。⾄于 (3~7)求和以「2乘⽅它」这个是基于看表(8+8)=16差8优化的,属于⽐较⼈性化的巧算,计算机就不需要这种。
说起来,⽐较 old-school 的教材绝对会列成
当然作为程序员还有些最好要记住的:
k2**k
101024
16 -1 == sizeof(short)32768
16 == sizeof(unsigned short)65536
8 -1 == sizeof(char)128
8 == sizeof(unsigned char/*aka byte*/)256
这个表我们程序员是不会忘,毕竟是 MIN_VALUE这些值域常量的值,偶尔见的到。
10到2(写出)
累积法:
现在的累积法变成取余再换除基数了,就是那个
这个⽅法对⼈类⽽⾔基本不可⽤,因为取余数意味着除法,挺⿇烦的;理解为:取余基数=拿最右位、换除基数=右移所有数位,如
[6]。
这个过程重复到数为0,或者说<1为⽌。
打表法:
基本等于累积法,但是从
解决的是取余的⿇烦。
解决的是取余的⿇烦
⽤⽐较数学的语⾔讲就是把数拆成
⽐如 5250 ,我们知道
记得最右是
就是 1000000000000 ,记得最右是
硅胶模具制作方法
递推处理 5250-4096 = 1154 ,记
递推处理 1154-1024 = 130 ,记
递推处理 130-128 = 2 ,记
⼆进制位 12,10,7,1 合并,得 1010010000010 。
再次强调,最右位是
,⽽且你编程的时候数组索引也都从0起始,数学这么做是⽅便位置计数法,计算机科学这么做是为了⽅便内存对象随机(随便)访问的编址取址。
晓得啥⼦叫『递推法』不?就是可以『递归』但本质只是循环(条件重复执⾏)的东西,⽐如懂 JavaScript 的应该写得出等价的程序版本:二氨基马来腈
var table = {}; // 2^k~k 的关系表
for (var k=0; k<12; k++) { table[2**k] = k; } // k 规范为指代数位
function decimalToBase2(acc, n) {
if (n == 0) console.log(acc);// 指定递推基线为若n是0, IO: 输出结果
else { // 不然的话
var _2powK = maxLTE(n, table);
var k = table[_2powK]; // 到最⼤不⼤的⼆进制位编号
return decimalToBase2(acc+2**k/*这⾥直接累回原数*/,  n-_2powK); // 递推累积剩下的
//^ ⽰例只累积回原n, Ctrl+Shift+K 在浏览器控制台⾥运⾏并试试⽀持输出⼆进制 String !
}
}
function maxLTE(n, tab) { // ⼀个函数,⼦程序。复⽤、抽提的思想很重要
var max = -Infinity; // JS ⾥是有不⼤于任何数的最⼩(浮点)值的
for (var k in tab) { k=Number(k); if (k > max && k <= n) max = k; }
return max; //^ 线性查算法,如果是有序表就不必完全遍历
}
// function=函数/⼦程序 ; var=其局部变量 ; if-else=若-否则 ; for=对于... ; return=以结果值退出函数
// if (condition) op1(); else op2(); 其中 opX(); 亦可是 {} 顺序执⾏块,语句。
// == 是相等性、 && 是逻辑且
// for (init; has_next; update)
decimalToBase2(0, 666)==666,这是个习题,有算法甚⾄程序分析变换基础的同学们可以试试看,
以这个刚刚咱⼿写的算法给它补完实现出来(递推程序,可以改两处)。Ctrl+Shift+K 打开『审查元素』有何不可。(顺便,数学短除法实质上就是递推,如果说每个半框⾥的数叫n 的话,它和上程序的结构很像)
不少⼈觉得编程需要数学,甚⾄⽣硬地引⼊各种莫名其妙、毫⽆实际价值的教程来『证明』这⼀点。但我想说:⽐起数学者,编程的⼈更像
针对不同输⼊在不同环境、不同场景多次执⾏,并被维护修改很多次的!
周密的活动策划者,程序(及其⼦部分)
(及其⼦部分)可是要针对不同输⼊在不同环境、不同场景多次执⾏,并被维护修改很多次的!
优美的程序会直观反映它所处理数据的结构。然后才是关系、逻辑,所以编程和数学的语⾔⽂化可以说编程第⼀重视程序和数据的结构,优美的程序会直观反映它所处理数据的结构。
简洁、重视定义⼒的语⾔的演说家,已经⽐许多只知⼀门语⾔、看不到复⽤性的数学家拥还不如编程和英语的⽂化“⾎缘”近。⼀个拥有简洁、重视定义⼒的语⾔
有更好的“程序设计”潜⼒。
最后16进到2的
我就说⼀个: 0xFA(再懒得⽤数学表⽰法了,下标得真是毫⽆章法[7]),
先⽆伤⼤雅的左补满4倍数位长,为 0x00FA[8]。
F=15 ⽤
0b1111
节能燃烧机A=10⽤上表⽰是

本文发布于:2024-09-25 19:22:44,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/98845.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:进制   程序   基数   数学   算法   数值   数组   位置
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议