#stack #hex #binary-operator #calculator #cli-tool #rpn #decimal

app qc

一个增强的 RPN 命令行工具,用于快速进行二进制、八进制、十进制、十六进制计算

2 个版本 (1 个稳定版)

1.0.0 2020 年 3 月 8 日
0.1.0 2019 年 12 月 15 日

#1791命令行工具

每月 23 次下载

CC0 许可证

24KB
437

qc

qc(简称 quick calc)是一个增强的逆波兰表示法(RPN)命令行工具,旨在辅助快速且简单的计算。

qc 对传统的 RPN 计算器进行了增强,包括在所有操作符前使用 :,它会弹出之前所有的项目,执行操作,并将结果推回栈上。以下是一些示例。

安装

预构建的二进制文件

Linux、macOS 和 Windows 的预构建二进制文件可以在 发布页面 上找到。

您可以使用以下命令下载 Linux、MacOS 或 Windows 的最新二进制文件,只需将 DEST 替换为您希望安装 qc 二进制文件的目录

curl --proto '=https' --tlsv1.2 -sSf \
  https://raw.githubusercontent.com/rrybarczyk/qc/master/bin/install \
  | bash -s -- --to DEST

Cargo

qc 使用 Rust 编写,可以从源代码构建并使用 cargo install qc 安装。要获取 Rust,请使用 rustup 安装程序

操作

二进制操作符

  • add 弹出栈顶的两个项目,将它们相加,并将和推回栈上
  • sub 弹出栈顶的两个项目,将它们相减,并将差推回栈上
  • mul 弹出栈顶的两个项目,将它们相乘,并将积推回栈上
  • div 弹出栈顶的两个项目,将它们相除,并将商推回栈上
  • : 弹出栈上的所有项目,使用二进制操作符折叠栈上的值,并将结果推回栈上

一元操作符

  • . 弹出栈顶的项目并打印它
  • pop 弹出栈顶的项目
  • endian 从栈中弹出顶部元素,交换字节序,并将结果压入栈中
  • :<一元运算符> 将一元运算符映射到当前栈元素上

示例

传统的RPN功能

加法

$ qc 1 2 add
Script                  Stack                   Details

                        [ ]
1                       [ 1 ]
2                       [ 1 2 ]
add                     [ 3 ]                   1 + 2


$ qc 1 2 3 add add
Script                  Stack                   Details
                        [ ]
1                       [ 1 ]
2                       [ 1 2 ]
3                       [ 1 2 3 ]
add                     [ 1 5 ]                  2 + 3
add                     [ 6 ]                    1 + 5

减法

$ qc 1 2 sub
Script                  Stack                   Details
                        [ ]
1                       [ 1 ]
2                       [ 1 2 ]
sub                     [ -1 ]                  1 - 2

$ qc 1 2 3 sub sub
Script                  Stack                   Details
                        [ ]
1                       [ 1 ]
2                       [ 1 2 ]
3                       [ 1 2 3 ]
sub                     [ 1 -1 ]                2 - 3
sub                     [ 2 ]                   1 - -1

乘法

$ qc 1 2 mul
Script                  Stack                   Details

                        [ ]
1                       [ 1 ]
2                       [ 1 2 ]
mul                     [ 2 ]                   1 * 2


$ qc 1 2 3 mul mul
Script                  Stack                   Details
                        [ ]
1                       [ 1 ]
2                       [ 1 2 ]
3                       [ 1 2 3 ]
mul                     [ 1 6 ]                 2 * 3
mul                     [ 6 ]                   1 * 6

除法

$ qc 3 9 div
Script                  Stack                   Details

                        [ ]
3                       [ 3 ]
9                       [ 3 9 ]
div                     [ 0.5 ]                 3 / 9


$ qc 1 2 3 div div
Script                  Stack                   Details
                        [ ]
1                       [ 1 ]
2                       [ 1 2 ]
3                       [ 1 2 3 ]
div                     [ 1 6 ]                 2 * 3
div                     [ 6 ]                   6 * 1

其他

$ qc 4 7 9 add 2 8 mul mul mul
Script                  Stack                   Details
4                       [ 4 ]
7                       [ 4 7 ]
9                       [ 4 7 9 ]
add                     [ 4 16 ]                7 + 9
2                       [ 4 16 2]
8                       [ 4 16 2 8 ]
mul                     [ 4 16 16 ]             2 * 8
mul                     [ 4 256 ]               16 * 16
mul                     [ 1024 ]                4 * 256
$ qc 4 7 9 add 2 8 mul mul 4 div sub
Script                  Stack                   Details
4                       [ 4 ]
7                       [ 4 7 ]
9                       [ 4 7 9 ]
add                     [ 4 16 ]                7 + 9
2                       [ 4 16 2]
8                       [ 4 16 2 8 ]
mul                     [ 4 16 16 ]             2 * 8
mul                     [ 4 256 ]               16 * 16
4                       [ 4 256 4]
div                     [ 4 64 ]                256 / 4
sub                     [ -60 ]                 4 - 64
$ qc 4 7 9 add add  2 3 5 mul mul mul 1 1 sub sub 20 5 div div .
Script                  Stack                   Details
4                       [ 4 ]
7                       [ 4 7 ]
9                       [ 4 7 9 ]
add                     [ 4 16 ]                7 + 9
add                     [ 20 ]                  4 + 16
2                       [ 20 2 ]
3                       [ 20 2 3 ]
5                       [ 20 2 3 5 ]
mul                     [ 20 2 15 ]             3 * 5
mul                     [ 20 30 ]               2 * 15
mul                     [ 600 ]                 20 * 30
1                       [ 600 1 ]
1                       [ 600 1 1 ]
sub                     [ 600 0 ]               600 - 1
sub                     [ 600 ]                 600 - 0
20                      [ 600 20 ]
5                       [ 600 20 5 ]
div                     [ 600 4 ]               20 / 5
div                     [ 150 ]                 600 / 4

> dec: 150        hex: 0x96          oct: o226        bin: b10010110

增强的RPN功能

$ qc 4 7 9 :add 2 3 5 :mul 1 1 :sub 20 5 :div .
Script                  Stack                   Details
4                       [ 4 ]
7                       [ 4 7 ]
9                       [ 4 7 9 ]
:add                    [ 20 ]                  4 + 7 + 9
2                       [ 20 2 ]
3                       [ 20 2 3 ]
5                       [ 20 2 3 5 ]
:mul                    [ 600 ]                 20 * 2 * 3 * 5
1                       [ 600 1 ]
1                       [ 600 1 1 ]
: sub                   [ 600 ]                 600 - (1 - 1)
20                      [ 600 20 ]
5                       [ 600 20 5 ]
:div                    [ 150 ]                 600 / (20 / 5)

> dec: 150        hex: 0x96          oct: o226        bin: b10010110

$ qc 0xa xb o22 b1101 :.
> dec: 13         hex: 0xd           oct: o15         bin: b1101
> dec: 18         hex: 0x12          oct: o22         bin: b10010
> dec: 11         hex: 0xb           oct: o13         bin: b1011
> dec: 10         hex: 0xa           oct: o12         bin: b1010

打印

弹出栈顶元素并打印。

$ qc 1 2 3 add add .
> dec: 6          hex: 0x6           oct: o6          bin: b110

$ qc 32 8 div .
> dec: 4          hex: 0x4           oct: o4          bin: b100

$ qc 1 2 3 :add 4 5 :mul .
> dec: 120        hex: 0x78          oct: o170        bin: b1111000


$ qc 0xa . xb . o22 . b1101 .
> dec: 10         hex: 0xa           oct: o12         bin: b1010
> dec: 11         hex: 0xb           oct: o13         bin: b1011
> dec: 18         hex: 0x12          oct: o22         bin: b10010
> dec: 13         hex: 0xd           oct: o15         bin: b1101

$ qc 0xa xb o22 b1101 :.
> dec: 13         hex: 0xd           oct: o15         bin: b1101
> dec: 18         hex: 0x12          oct: o22         bin: b10010
> dec: 11         hex: 0xb           oct: o13         bin: b1011
> dec: 10         hex: 0xa           oct: o12         bin: b1010

字节序交换

要交换值的字节序,还需要宽度: $ qc <value> <byte width> endian.

$ qc 0xdeadbabe 4 endian .
> dec: 3199905246         hex: 0xbebaadde         oct: o27656526736       bin: b10111110101110101010110111011110

$ qc 0xdeadbabe 2 endian .
> dec: 3735928506         hex: 0xdeadbeba         oct: o33653337272       bin: b11011110101011011011111010111010

$ qc 0xe803000000000000 0xd007000000000000  8 :endian :.
> dec: 2000               hex: 0x7d0              oct: o3720              bin: b11111010000
> dec: 1000               hex: 0x3e8              oct: o1750              bin: b1111101000

$ qc 0x1234000000000000 0x5678000000000000 8 :endian :.
> dec: 30806              hex: 0x7856             oct: o74126             bin: b111100001010110
> dec: 13330              hex: 0x3412             oct: o32022             bin: b11010000010010

待办事项

  • 十六进制、八进制和二进制格式化打印
  • 所有栈元素的字节序交换和格式化打印
  • 所有栈元素的哈希
qc 0x00000000000003e8 0x00000000000007d0 :sha256d
  • 连接所有栈元素并进行哈希
qc 0x00000000000003e8 0x00000000000007d0 :cat sha256d

字符指南

安全

SPACE
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789
@[]^_{}+,-./:

危险

\`|~<>"'#&()*;? TAB

可疑

{}!%=
~ - can use if not first character in a line
$ - on its own can be an operator, but not in fish
% - used for job control than zsh
= _ zsh ? is not ok

依赖

~3MB
~51K SLoC