# TBE
Truncated Binary Encoding
https://en.wikipedia.org/wiki/Truncated_binary_encoding
```rust
k = floor_log2(n);
u = 2 * exp2(k) - n
```
## Writing
if `x < u` write `k` least significant bits of `x` else add `u` to `x` and write `k` most significant bits of `x` and then write a least significant bit of `x`.
## Reading
1. read `k` bits as `x`.
2. if `u` <= `x` then read an additional bit and add it to `x` as a least significant bit and substract `u`.
## Examples (MSB first)
### n = 2
```rust
k = 1;
u = 4 - 2 = 2;
```
0| 0| |
1| 1| |
n| |u|
### n = 3
```rust
k = 2;
u = 1
```
00| 0X| 0X| |
01| 10| 10|u|
10| 11| 11| |
### n = 4
```
k = 2
u = 8 - 4 = 4
```
00| 00| |
01| 01| |
10| 10| |
11| 11| |
n| |u|
### n = 5
```
k = 2;
u = 3;
```
000| 00| |
001| 01| |
010| 10| |
011|110|u|
100|111| |
### n = 6
```
k = 2;
u = 2;
```
000| 00|
001| 01|
010|100|
011|101|
100|110|
101|111|
### n = 7
000| 00|
001|010|
010|011|
011|100|
100|101|
101|110|
110|111|
### n = 10
```
k = 3;
u = 6;
```
0000| 000X| 000X|
0001| 001X| 100X|
0010| 010X| 010X|
0011| 011X| 110X|
0100| 100X| 001X|
0101| 101X| 101X|
0110| 1100| 0110|
0111| 1101| 0111|
1000| 1110| 1110|
1001| 1111| 1111|