hwcalc

hwcalc, or hc, is an arbitrary bit width calculator.

Documentation

Refer to the man page at docs/man/hc.1, use e.g.

$ man -l docs/man/hc.1

There is also a rendered version available at https://hllmn.net/man/hc.1.

Build

The Cargo package manager can be used to fetch dependencies and build hc:

$ cargo build --release

The resulting binary will be located at target/release/hc.

Install

The makefile has a rule for installing the hc binary and the man page:

```

make install

```

There is also an uninstall rule:

```

make uninstall

```

Alternatively, hc can be installed from crates.io via Cargo:

cargo install hwcalc

This will install the hc binary in bin/hc under the Cargo root folder (typically ~/.cargo) but will not install the man page.

Examples

hc mostly works like a typical calculator, one can enter expressions that will be evaluated: ```

(2 + 7) * 0xd 117 = 0b111_0101 = 0o165 = 0x75 ```

Numbers can be given a specific width with a type specifier:

```

77u8 77 = 0b0100_1101 = 0o115 = 0x4d ``` For negative numbers, the non-decimal representations will display the two's complement value:

```

-77i8 -77 (= 179) = 0b1011_0011 = 0o263 = 0xb3 ```

The signedness of a number affects how it is extended when operands differ in width:

```

32u8 + (-1)'i4 31 = 0b00011111 = 0o037 = 0x1f 32u8 + (-1)'u4 47 = 0b00101111 = 0o057 = 0x2fa ```

Values may not only have integer values, they may also contain a fractional part:

```

10/4 2.5 (= 5/2) = 0b10.1 = 0o2.4 = 0x2.8 ```

By default, the precision is infinite, if a value cannot be represented by a finite number of digits, infinitively repeating sequences of digits will be enclosed with parentheses:

```

1/3 0.(3) (= 1/3) = 0b0.(01) = 0o0.(25) = 0x0.(5) ```

If a fractional width is specified, the fractional part will be truncated:

```

1/3q.8 0.33203125 (= 85/256) = 0b0.0101_0101 = 0o0.252 = 0x0.55 ```

Negative numbers with an unspecified integer width will have an infinitively repeating digit in the integer part for non-decimal bases:

```

-5.25 -5.25 (= -21/4) = 0b(1)010.11 = 0o(7)2.6 = 0x(f)a.c ```