V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
septet
V2EX  ›  程序员

你们对进制的转换都熟悉吗?

  •  
  •   septet · 2018-01-27 13:09:08 +08:00 · 6173 次点击
    这是一个创建于 2490 天前的主题,其中的信息可能已经有所发展或是发生改变。

    感觉好难,每次遇到进制的转换或者计算都要 Google,特别是 16 进制,你们遇到进制的转换有什么好的方法吗

    第 1 条附言  ·  2018-01-27 17:16:32 +08:00
    感谢大家的评论

    我提出这个问题的目的是怎样方便理解在看到不同进制之间的转换能够又一个清晰的思路,这样不会导致在实践中不会无从下手,比如在做验证的时候,不同的进制作为在程序中作为向量或者指针,而你的目的就是要让他们一一对应,如果不理解进制之间的转换原理很难,就算你网上查到答案了,以后在遇到同样的问题还是一脸懵逼。
    评论中大家也各有各的方法,从中也让我对进制有了更深的理解。谢谢大家🙏
    40 条回复    2018-01-29 17:42:01 +08:00
    luojianxhlxt
        1
    luojianxhlxt  
       2018-01-27 13:13:05 +08:00 via iPhone
    windows 自带的计算器
    loading
        2
    loading  
       2018-01-27 13:13:54 +08:00 via Android
    自己算不怕错?
    怕丢人就自己写一个计算器…
    weiwio
        3
    weiwio  
       2018-01-27 13:13:54 +08:00 via Android
    心算
    crab
        4
    crab  
       2018-01-27 13:19:23 +08:00
    @loading FF 范围内还好吧。超过就不好说哈。
    chiu
        5
    chiu  
       2018-01-27 13:33:15 +08:00 via Android
    做底层驱动的,感觉已经习惯了……
    WordTian
        6
    WordTian  
       2018-01-27 13:34:35 +08:00 via iPhone
    计算器 + 1
    congeec
        7
    congeec  
       2018-01-27 13:34:42 +08:00
    涉及 10 进制我觉得转换比较麻烦。16 进制和 2 进制互转比较简单,有技巧。
    话说楼主什么场景下需要转换进制?
    Heinz
        8
    Heinz  
       2018-01-27 13:37:32 +08:00 via iPhone
    为了考试,我已经把进制转换练熟了,如果真的有自己算的需求的话,只能说熟能生巧
    Osk
        9
    Osk  
       2018-01-27 13:48:44 +08:00 via Android
    仅限于 0xFF 以内还勉强能算。。。
    baozijun
        10
    baozijun  
       2018-01-27 13:54:41 +08:00 via iPhone
    推荐 pccal
    maemual
        11
    maemual  
       2018-01-27 13:55:09 +08:00
    用计算器不丢人。。。
    septet
        12
    septet  
    OP
       2018-01-27 13:56:44 +08:00
    @congeec 最近对接一个 API,登录密码、签名验证需要 16 进制和 10 进制的转换和计算,突然发现自己在这一块好难下手。。。
    geelaw
        13
    geelaw  
       2018-01-27 14:07:11 +08:00 via iPhone
    更自然的想法是“寻找一个数在某进制下的字符串形式”,因为进制本身并不是数的属性。

    如果是手算,原来的数本身也具有一个表示形式,才有所谓“转换”。如果是计算机运算,你也可以假想数是本来是用二进制表示的,不过这样想的用处不大。
    septet
        14
    septet  
    OP
       2018-01-27 14:13:22 +08:00
    @geelaw 自己更习惯的是遇到要转换的进制,都是先转换为 10 进制,进而再转换为目标进制
    imdong
        15
    imdong  
       2018-01-27 14:22:37 +08:00
    Win + Q => calc => 回车

    然后选择程序员模式。青石搞定。
    rockyou12
        16
    rockyou12  
       2018-01-27 14:23:41 +08:00 via Android
    2 进制转换当然有诀窍,8421,每一位对应一个二进制位。比如二进制 0101 就是 4+1,二进制 1111 就是 8+4+2+1。而且 4 个二进制位刚好就是 16 进制 1 位,所以这也是 16 进制到 2 进制的诀窍
    chenstack
        17
    chenstack  
       2018-01-27 14:23:43 +08:00
    有段时间热衷于 GBA 和 NES 游戏的修改及汉化,经常用到 2 进制和 16 进制,对转换比较敏感。平时转换的话,可以随时调出终端用 python 算,hex, bin 函数很方便
    sunjourney
        18
    sunjourney  
       2018-01-27 14:24:37 +08:00
    2,8,16 心算还行
    Building
        19
    Building  
       2018-01-27 14:26:46 +08:00 via iPhone
    和正则表达式一样,每用一次都要重新学一次。
    fantasynoff
        20
    fantasynoff  
       2018-01-27 14:48:16 +08:00
    03E7
    270F
    98967F
    3B9AC9FF
    就这些用的多...
    5mins
        21
    5mins  
       2018-01-27 16:32:53 +08:00
    bramblex
        22
    bramblex  
       2018-01-27 16:44:03 +08:00
    嗯...

    其实为啥要进制转换啊,无论 2 / 8 / 16 / 10 都是表示同一个数啊
    geelaw
        23
    geelaw  
       2018-01-27 16:52:41 +08:00
    @septet https://geelaw.blog/entries/rethinking-base-conversion/ 简单来说,变成你会做算术的进制的方法是级数求和(多项式求值,可以用秦九韶方法),从你会做算术的进制变成你不会做算术的进制的方法是反复做带余除法。

    如果你用 Windows 的话,在 PowerShell 里直接 (十进制数字).ToString('x') 就得到十六进制的表示,或者 0x 十六进制 就得到了十进制的表示。

    @bramblex #22 因为你需要表示一个数,而表示一个数最常见的方法是使用进位制。
    5mins
        24
    5mins  
       2018-01-27 16:53:12 +08:00   ❤️ 1
    我们将物质的现象跟物质本身区分开来。假设一个数,这个数在十进制里面的表示是:10,在二进制的表示是:1010,十六进制是:A,八进制是:12。一个数可以有不同的表现形式,但这个数本身所代表的是不会随着表现形式的变更而改变的。我理解的数不是一个“数”,会将它想象成数轴上的有限的一段,或者说想象成一段绳子,或者一壶水。用“十进制”的一排杯子(规则)去装这壶水,那看到的就是这壶水在十进制下的表现形式。这样去理解进制转换的话可能会容易理解一点。
    bramblex
        25
    bramblex  
       2018-01-27 17:02:58 +08:00
    @geelaw

    运算又不会因为进制不同就产生不同结果,毕竟计算机里存储的都是二进制数。

    难道我用不同进制表示一个数,这个数大小就改变了,加减乘除性质就不一样了?

    除了输出成字符串用于展示的时候存在意义,其他时候我看不见手动转换进制有任何意义,并且绝大多数语言标准库里都有根据进制输出字符串的函数。
    geelaw
        26
    geelaw  
       2018-01-27 17:13:45 +08:00 via iPhone
    @bramblex 计算机并不一定要用二进制存储一个数。只是你常用(我也常用)那种用二进制存储的计算机。

    您后半段论证感觉就是:研究更好的排序算法是没有意义的,因为标准库里有排序算法。

    问题的价值在于问题本身,而不是它有什么用。当然这样论证会导致不反对 X-Y 问题,但就这个进位制转换的特殊问题来说,它本身的意义还是很明显的。
    crbee
        27
    crbee  
       2018-01-27 17:32:45 +08:00
    @fantasynoff 改游戏币么 - -
    iugo
        28
    iugo  
       2018-01-27 17:46:20 +08:00
    JavaScript 在这种情况还是挺方便的. 浏览器控制台.

    ```
    var num = 999;
    num.toString(16);
    ```
    akira
        29
    akira  
       2018-01-27 17:46:43 +08:00
    看习惯了就好。
    bramblex
        30
    bramblex  
       2018-01-27 18:34:44 +08:00
    @geelaw

    你说的非常对,但是说实话, 鸡同鸭讲……。因为我们两个人分别是在不同的 “隐含前提” 下进行的论述,所以得出不同结论非常正常。
    jason19659
        31
    jason19659  
       2018-01-27 20:38:02 +08:00
    开浏览器写 js。。
    l00t
        32
    l00t  
       2018-01-27 21:08:56 +08:00
    正整数都还好。遇到负数和浮点数,我有点心累…… 还是直接上计算器吧……
    littlebutt
        33
    littlebutt  
       2018-01-27 21:34:17 +08:00 via iPhone
    学生党表示暂时没有压力,不过毕业以后这些东西应该很快会忘掉吧
    koushiro
        34
    koushiro  
       2018-01-27 21:49:24 +08:00 via Android
    写半年底层 不熟也熟了→_→
    gnaggnoyil
        35
    gnaggnoyil  
       2018-01-27 22:12:18 +08:00
    @bramblex 然而如果你写过高精度运算库的话就会发现进制转换的问题也是可以很要命的……
    mauve
        36
    mauve  
       2018-01-27 22:12:30 +08:00
    组成原理基本操作,二进制中转一下,数大一些的需要计算器
    alcarl
        37
    alcarl  
       2018-01-27 22:21:46 +08:00 via Android
    随便算算就用计算器,近期老用就用 perl python 啥的写几段代码来转换
    cppgohan
        38
    cppgohan  
       2018-01-27 23:53:51 +08:00
    大一学计算机导论, oct, hex, binary 似乎都覆盖了.. 感觉进制转换谈不上"原理", 值不变, 只是表示的方式不同

    当然最快还是 win10 的计算器.
    bramblex
        39
    bramblex  
       2018-01-28 02:14:37 +08:00
    @gnaggnoyil

    不仅仅高精度,大数一样蛋疼。不过我讨论的前提是我们日常一般程序的开发场景下,不仅不需要开发高精度库,甚至连使用高精度库都不需要……

    如果凡事都讨论极端条件,那就没完了。
    rexyan
        40
    rexyan  
       2018-01-29 17:42:01 +08:00
    来几遍子网掩码,坨坨的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5069 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:13 · PVG 09:13 · LAX 17:13 · JFK 20:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.