中文域名注册服务网站,石家庄网站建设全包,杭州百度做网站多少钱,jsp网站开发书籍推荐相信很多人#xff0c;在工作中会需要使用到计算器。一般的做法是#xff0c;打开并使用系统自带的计算器。这种做法可能对我来说#xff0c;有如下几个问题。太慢。每次需要打开计算器#xff0c;然后改成编程模式#xff0c;手工选择进制#xff0c;再使用输入表达式进…相信很多人在工作中会需要使用到计算器。一般的做法是打开并使用系统自带的计算器。这种做法可能对我来说有如下几个问题。太慢。每次需要打开计算器然后改成编程模式手工选择进制再使用输入表达式进行计算。需要切换窗口。编程时经常是在终端中使用GUI计算器则意味着要离开终端计算完毕再切换回来。无法使用混合进制表达式。混合进制的意思是在一个表达式中同时使用多种进制如“0x10 * 10”表示十六进制的0x10乘以十进制的10。如果以上有一条你也有同感的话那么你也应该试一下使用命令行计算器。命令行计算器调用bc只需经过简单的搜索便可以了解到linux中原生提供了一个命令行计算器 GNU bc。GNU bc支持高精度数字和多种数值类型(例如二进制、十进制、十六进制)的输入输出。bc的交互式使用方式运行bc进入交互模式。在交互模式中输入表达式回车即可获得结果。需要退出时输入quit退出即可。bc的非交互式使用方式通过管道将表达式传入。使用效果如下zhuangqiubinzhuangqiubin-PC:~$ bcbc 1.07.1Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.This is free software with ABSOLUTELY NO WARRANTY.For details type warranty.123quitzhuangqiubinzhuangqiubin-PC:~$ echo 12 | bc3OKget到了命令行计算器的新技能了但每次进入交互模式或者手工输入“echo 表达式 | bc ”都感觉略麻烦。那这个时候就需要脚本写个mycalc.sh好了zhuangqiubinzhuangqiubin-PC:~$ cat mycalc.sh#!/bin/bashecho $ | bczhuangqiubinzhuangqiubin-PC:~$ ./mycalc.sh 123再把mycalc.sh拷贝到可访问的目录下如sudo mv mycalc.sh /usr/bin对于没有sudo权限的情况那也可以变通下mkdir -p ~/usr/binmv mycalc.sh ~/usr/binecho export PATH$HOME/usr/bin:$PATH ~/.bashrcsource ~/.bashrc再alias一个顺手的命令名比如拼音jisuanecho alias jisuanmycalc.sh ~/.bashrc更多bc的用法可以通过man bc查看网上也有许多介绍资料。解决进制问题bc仍然需要手工指定进制在表达式前使用ibase参数和obase参数指定输入输出的进制。并且不支持混合进制因为ibase每次只能指定一种进制。zhuangqiubinzhuangqiubin-PC:~$ echo 1010 | bc20zhuangqiubinzhuangqiubin-PC:~$ echo ibase16;1010 | bc32但我们既然已经有了一个包装脚本mycalc.sh那是不是可以把进制转换的工作交给它呢当然可以。我们可以让mycalc.sh先处理下表达式中的数字约定0x开头为十六进制不带前缀为十进制0o开头为八进制0b开头为二进制。mycalc先将所有参数转换成统一的进制如十进制然后计算表达式的值最终将结果再以多种进制的形式输出。这样我们就不同手工处理进制问题了。至于输出为了方便起见可以多种进制一起输出需要哪个用哪个即可使用示例zhuangqiubinzhuangqiubin-PC:~$ type jisuanjisuan 是 ~/mywork/mygithub/smartbc/smartbc 的别名zhuangqiubinzhuangqiubin-PC:~$ jisuan 1010Original EQUATION: 1010Decimal EQUATION: 1010base2 : 10100base8 : 24base10: 20base16: 14zhuangqiubinzhuangqiubin-PC:~$ jisuan 100x10Original EQUATION: 100x10Decimal EQUATION: 1016base2 : 11010base8 : 32base10: 26base16: 1A更好的实现使用python以上基于bc的计算器已经可以满足我的需求了也使用了一段时间。但其实还有更好的实现方式使用python。在命令行中输入python进入交互模式即可像bc一样执行表达式得到结果。更棒的是原生支持混合进制不需要自己写代码预处理表达式了。简单可靠。代码及使用示例zhuangqiubinzhuangqiubin-PC:~$ type jisuanjisuan 是 ~/.pycalc.py 的别名zhuangqiubinzhuangqiubin-PC:~$ cat ~/.pycalc.py#!/usr/bin/env python2import sysequationsys.argv[1]resulteval(equation)if isinstance(result, (float)):print Attention:only base10 is float, others change to int before typeprint equation:,sys.argv[1]print base2 : ,str(bin(int(result)))print base8 : ,str(oct(int(result)))print base10: ,str((result))print base16: ,str(hex(int(result)))zhuangqiubinzhuangqiubin-PC:~$ jisuan 1010equation: 1010base2 : 0b10100base8 : 024base10: 20base16: 0x14zhuangqiubinzhuangqiubin-PC:~$ jisuan 100x10equation: 100x10base2 : 0b11010base8 : 032base10: 26base16: 0x1a更多输出格式一般输出十六进制十进制二进制三种结果就足够用了。但如果有特殊需求也可自己拓展。比如当需要核对寄存器检查某个bit时一个个去数二进制的第19位是很费眼睛的一件事。这个时候就需要更加直观的输出可以一眼看到某个bit是0还是1。那好办给二进制加上下标好了。如下代码#!/usr/bin/env python2import sysdef formatBinString(num):resultbit: result_indexindex: num_lenlen(num)if num_len 32:return for i in num:num_len-1resultiresult | result_indexstr(num_len).zfill(2)result_index| return result\nresult_indexequationsys.argv[1]resulteval(equation)if isinstance(result, (float)):print Attention:only base10 is float, others change to int before typeprint equation:,sys.argv[1]print print base2 : ,str(bin(int(result)))print base8 : ,str(oct(int(result)))print base10: ,str((result))print base16: ,str(hex(int(result)))print print formatBinString(str(bin(int(result))[2:].zfill(32)))效果zhuangqiubinzhuangqiubin-PC:~$ jisuan 100x10equation: 100x10base2 : 0b11010base8 : 032base10: 26base16: 0x1abit: 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |index: 31| 30| 29| 28| 27| 26| 25| 24| 23| 22| 21| 20| 19| 18| 17| 16| 15| 14| 13| 12| 11| 10| 09| 08| 07| 06| 05| 04| 03| 02| 01| 00|