Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于进制 #354

Open
toFrankie opened this issue Dec 22, 2024 · 0 comments
Open

关于进制 #354

toFrankie opened this issue Dec 22, 2024 · 0 comments
Labels
2024 2024 年撰写 JS 与 JavaScript、ECMAScript 相关的文章

Comments

@toFrankie
Copy link
Owner

toFrankie commented Dec 22, 2024

简介

进制(进位制)是一种记数方式,可以用有限的“数字符号”表示所有的数值。

进位表示在一个位值的数字达到基数后,将其重置为零并使高一位的数字加一。

比如,十进制只有 0 ~ 9 这十个数字符号,表示第十一个数(从 0 起),就要进一位,变成 10。其他进制同理。

进制数转换

以 35 为例:

  • 二进制:100011
  • 八进制:43
  • 十进制:35
  • 十六进制:23

十进制 → 二进制、八进制、十六进制

整数部分和小数部分的转换规则不太一样。

简单来说:整数部分取余逆序,小数部分乘法取整正序。

以 35.125 为例。

整数部分转二进制:

  • 35 / 2:商 17,余数 1
  • 17 / 2:商 8,余数 1
  • 8 / 2:商 4,余数 0
  • 4 / 2:商 2,余数 0
  • 2 / 2:商 1,余数 0
  • 1 / 2:商 0,余数 1

不断除以 2,直至商为 0。从最后一个余数读起(逆序),便是其二进制数 100011。其他进制同理,除以 8、16。

小数部分转二进制:

  • 0.125 * 2:积 0.25,取整数部分 0,剩 0.25
  • 0.25 * 2:积 0.5,取整数部分 0,剩 0.5
  • 0.5 * 2:积 1,取整数部分 1,剩 0

不断乘以 2,取出结果的整数部分,再余下的小数部分重复计算,直到积的小数部分为 0。从第一个积读起(正序)取其整数部分,便是其二进制数 001。其他进制同理,乘以 8、16。

最后,将整数和小数合起来,十进制数 35.125 对应的二进制数为 100011.001

小数部分的误差:

有时,不断乘以 2 得到的积的小数部分永远不为 0,但精度要求,因此也会有舍入的操作。

以 0.8 为例:

  • 0.8 * 2:积 1.6,取整数部分 1,剩 0.6
  • 0.6 * 2:积 1.2,取整数部分 1,剩 0.2
  • 0.2 * 2:积 0.4,取整数部分 0,剩 0.4
  • 0.4 * 2:积 0.8,取整数部分 0,剩 0.8
  • 0.8 * 2:积 1.6,取整数部分 1,剩 0.6
  • 无限循环...

对应的二进制为 1100 1100 1100 1100...

二进制、八进制、十六进制 → 十进制

35 用十进制的表示法如下:

$$35 = 3 * 10^1 + 5 * 10^0$$

以从左到右的书写习惯为例,左侧为高位,右侧为低位。

其中 3、5 为位值,10^1、10^0 为权值。

从低位起(从右往左),其权值分别为 10^0、10^1、...、10^n-1(10 表示为对应进制,n 表示位数)。

将每位的位值乘以权值,再求和就是对应的十进制值。

二进制 100011

$$35 = 1 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0$$

八进制 43

$$35 = 4 * 8^1 + 3 * 8^0$$

十六进制 23

$$35 = 2 * 16^1 + 3 * 16^0$$

二进制、八进制、十六进制互转

一位八进制用三位二进制表示,一位十六进制用四位二进制表示。位数不够,高位补零。

  • 二进制 100011
  • 八进制 100 01143
  • 十六进制 0010 001123

十六进制转八进制,可以先转为二进制,再转为八进制。

位运算

未完待续...

@toFrankie toFrankie added 2024 2024 年撰写 JS 与 JavaScript、ECMAScript 相关的文章 labels Dec 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
2024 2024 年撰写 JS 与 JavaScript、ECMAScript 相关的文章
Projects
None yet
Development

No branches or pull requests

1 participant