<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://debianws.lexgopc.com/wiki143/index.php?action=history&amp;feed=atom&amp;title=Truncated_binary_encoding</id>
	<title>Truncated binary encoding - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://debianws.lexgopc.com/wiki143/index.php?action=history&amp;feed=atom&amp;title=Truncated_binary_encoding"/>
	<link rel="alternate" type="text/html" href="http://debianws.lexgopc.com/wiki143/index.php?title=Truncated_binary_encoding&amp;action=history"/>
	<updated>2026-04-30T14:32:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>http://debianws.lexgopc.com/wiki143/index.php?title=Truncated_binary_encoding&amp;diff=161201&amp;oldid=prev</id>
		<title>imported&gt;Steel1943: /* History */ fix common MOS:REFSPACE spacing errors, replaced: /ref&gt;a → /ref&gt; a</title>
		<link rel="alternate" type="text/html" href="http://debianws.lexgopc.com/wiki143/index.php?title=Truncated_binary_encoding&amp;diff=161201&amp;oldid=prev"/>
		<updated>2025-03-24T03:04:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;History: &lt;/span&gt; fix common &lt;a href=&quot;/wiki143/index.php?title=MOS:REFSPACE&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;MOS:REFSPACE (page does not exist)&quot;&gt;MOS:REFSPACE&lt;/a&gt; spacing errors, replaced: /ref&amp;gt;a → /ref&amp;gt; a&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{More references|date=December 2009}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Truncated binary encoding&amp;#039;&amp;#039;&amp;#039; is an [[entropy encoding]] typically used for uniform [[probability distribution]]s with a finite alphabet. It is parameterized by an alphabet with total size of number &amp;#039;&amp;#039;n&amp;#039;&amp;#039;. It is a slightly more general form of [[Binary numeral system|binary encoding]] when &amp;#039;&amp;#039;n&amp;#039;&amp;#039; is not a [[power of two]].&lt;br /&gt;
&lt;br /&gt;
If &amp;#039;&amp;#039;n&amp;#039;&amp;#039; is a power of two, then the coded value for 0 ≤ &amp;#039;&amp;#039;x&amp;#039;&amp;#039; &amp;lt; &amp;#039;&amp;#039;n&amp;#039;&amp;#039; is the simple binary code for &amp;#039;&amp;#039;x&amp;#039;&amp;#039; of length log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(&amp;#039;&amp;#039;n&amp;#039;&amp;#039;). Otherwise let &amp;#039;&amp;#039;k&amp;#039;&amp;#039; = floor(log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(&amp;#039;&amp;#039;n&amp;#039;&amp;#039;)), such that 2&amp;lt;sup&amp;gt;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;lt;/sup&amp;gt; &amp;lt; &amp;#039;&amp;#039;n&amp;#039;&amp;#039; &amp;lt; 2&amp;lt;sup&amp;gt;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;+1&amp;lt;/sup&amp;gt;and let &amp;#039;&amp;#039;u&amp;#039;&amp;#039; = 2&amp;lt;sup&amp;gt;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;+1&amp;lt;/sup&amp;gt; − &amp;#039;&amp;#039;n&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Truncated binary encoding assigns the first &amp;#039;&amp;#039;u&amp;#039;&amp;#039; symbols codewords of length &amp;#039;&amp;#039;k&amp;#039;&amp;#039; and then assigns the remaining &amp;#039;&amp;#039;n&amp;#039;&amp;#039; − &amp;#039;&amp;#039;u&amp;#039;&amp;#039; symbols the last &amp;#039;&amp;#039;n&amp;#039;&amp;#039; − &amp;#039;&amp;#039;u&amp;#039;&amp;#039; codewords of length &amp;#039;&amp;#039;k&amp;#039;&amp;#039; + 1. Because all the codewords of length &amp;#039;&amp;#039;k&amp;#039;&amp;#039; + 1 consist of an unassigned codeword of length &amp;#039;&amp;#039;k&amp;#039;&amp;#039; with a &amp;quot;0&amp;quot; or &amp;quot;1&amp;quot; appended, the resulting code is a [[prefix code]].&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Used since at least 1984, &amp;#039;&amp;#039;&amp;#039;phase-in codes&amp;#039;&amp;#039;&amp;#039;, also known as &amp;#039;&amp;#039;&amp;#039;economy codes&amp;#039;&amp;#039;&amp;#039;,&amp;lt;ref&amp;gt;Eastman, Willard L, &amp;#039;&amp;#039;et al.&amp;#039;&amp;#039; (Aug. 1984) [https://patentimages.storage.googleapis.com/86/7d/56/dd49314023387d/US4464650.pdf Apparatus and Method for Compressing Data Signals and Restoring the Compressed Data Signals], US Patent 4,464,650.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Acharya, Tinku et Já Já, Joseph F. (oct. 1996), [https://www.sciencedirect.com/science/article/abs/pii/0020025596000898 An on-line variable-length binary encoding of text], Information Sciences, vol 94 no 1-4, p. 1-22.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Job van der Zwan. [https://observablehq.com/@jobleonard/phase-in-codes &amp;quot;Phase-in Codes&amp;quot;].&amp;lt;/ref&amp;gt; are also known as truncated binary encoding.&lt;br /&gt;
&lt;br /&gt;
==Example with &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 5==&lt;br /&gt;
For example, for the alphabet {0, 1, 2, 3, 4}, &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 5 and 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; ≤ &amp;#039;&amp;#039;n&amp;#039;&amp;#039; &amp;lt; 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;, hence &amp;#039;&amp;#039;k&amp;#039;&amp;#039; = 2 and &amp;#039;&amp;#039;u&amp;#039;&amp;#039; = 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; − 5 = 3. Truncated binary encoding assigns the first &amp;#039;&amp;#039;u&amp;#039;&amp;#039; symbols the codewords 00, 01, and 10, all of length 2, then assigns the last &amp;#039;&amp;#039;n&amp;#039;&amp;#039; − &amp;#039;&amp;#039;u&amp;#039;&amp;#039; symbols the codewords 110 and 111, the last two codewords of length 3.&lt;br /&gt;
&lt;br /&gt;
For example, if &amp;#039;&amp;#039;n&amp;#039;&amp;#039; is 5, plain binary encoding and truncated binary encoding allocates the following [[Code word (communication)|codewords]]. Digits shown &amp;lt;del&amp;gt;struck&amp;lt;/del&amp;gt; are not transmitted in truncated binary.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Truncated&amp;lt;br/&amp;gt;binary !!colspan=3| Encoding !! Standard&amp;lt;br/&amp;gt;binary&lt;br /&gt;
|-&lt;br /&gt;
|align=right| 0 ||bgcolor=silver| &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt; || 0 || 0 ||align=left| 0&lt;br /&gt;
|-&lt;br /&gt;
|align=right| 1 ||bgcolor=silver| &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt; || 0 || 1 ||align=left| 1&lt;br /&gt;
|-&lt;br /&gt;
|align=right| 2 ||bgcolor=silver| &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt; || 1 || 0 ||align=left| 2&lt;br /&gt;
|-&lt;br /&gt;
|align=right| UNUSED ||bgcolor=silver| &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt; ||bgcolor=silver| &amp;lt;del&amp;gt;1&amp;lt;/del&amp;gt; ||bgcolor=silver| &amp;lt;del&amp;gt;1&amp;lt;/del&amp;gt; ||align=left| 3&lt;br /&gt;
|-&lt;br /&gt;
|align=right| UNUSED ||bgcolor=silver| &amp;lt;del&amp;gt;1&amp;lt;/del&amp;gt; ||bgcolor=silver| &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt; ||bgcolor=silver| &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt; ||align=left| 4&lt;br /&gt;
|-&lt;br /&gt;
|align=right| UNUSED ||bgcolor=silver| &amp;lt;del&amp;gt;1&amp;lt;/del&amp;gt; ||bgcolor=silver| &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt; ||bgcolor=silver| &amp;lt;del&amp;gt;1&amp;lt;/del&amp;gt; ||align=left| 5/UNUSED&lt;br /&gt;
|-&lt;br /&gt;
|align=right| 3 || 1 || 1 || 0 ||align=left| 6/UNUSED&lt;br /&gt;
|-&lt;br /&gt;
|align=right| 4 || 1 || 1 || 1 ||align=left| 7/UNUSED&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It takes 3 bits to encode &amp;#039;&amp;#039;n&amp;#039;&amp;#039; using straightforward binary encoding, hence 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; − &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 8 − 5 = 3 are unused.&lt;br /&gt;
&lt;br /&gt;
In numerical terms, to send a value &amp;#039;&amp;#039;x&amp;#039;&amp;#039;, where 0 ≤ &amp;#039;&amp;#039;x&amp;#039;&amp;#039; &amp;lt; &amp;#039;&amp;#039;n&amp;#039;&amp;#039;, and where there are 2&amp;lt;sup&amp;gt;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;lt;/sup&amp;gt; ≤ &amp;#039;&amp;#039;n&amp;#039;&amp;#039; &amp;lt; 2&amp;lt;sup&amp;gt;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;+1&amp;lt;/sup&amp;gt; symbols, there are &amp;#039;&amp;#039;u&amp;#039;&amp;#039; = 2&amp;lt;sup&amp;gt;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;+1&amp;lt;/sup&amp;gt; − &amp;#039;&amp;#039;n&amp;#039;&amp;#039; unused entries when the alphabet size is rounded up to the nearest power of two. The process to encode the number &amp;#039;&amp;#039;x&amp;#039;&amp;#039; in truncated binary is: if &amp;#039;&amp;#039;x&amp;#039;&amp;#039; is less than &amp;#039;&amp;#039;u&amp;#039;&amp;#039;, encode it in &amp;#039;&amp;#039;k&amp;#039;&amp;#039; binary bits; if &amp;#039;&amp;#039;x&amp;#039;&amp;#039; is greater than or equal to &amp;#039;&amp;#039;u&amp;#039;&amp;#039;, encode the value &amp;#039;&amp;#039;x&amp;#039;&amp;#039; + &amp;#039;&amp;#039;u&amp;#039;&amp;#039; in &amp;#039;&amp;#039;k&amp;#039;&amp;#039; + 1 binary bits.&lt;br /&gt;
&lt;br /&gt;
==Example with &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 10==&lt;br /&gt;
Another example, encoding an alphabet of size 10 (between 0 and 9) requires 4&amp;amp;nbsp;bits, but there are 2&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 10 = 6 unused codes, so input values less than 6 have the first bit discarded, while input values greater than or equal to 6 are offset by 6 to the end of the binary space. (Unused patterns are not shown in this table.)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Input&amp;lt;br/&amp;gt;value !! Offset !! Offset&amp;lt;br/&amp;gt;value !! Standard&amp;lt;br/&amp;gt;binary || Truncated&amp;lt;br /&amp;gt;binary&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 ||  0 || &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt;000 || 000 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 ||  1 || &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt;001 || 001 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0 ||  2 || &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt;010 || 010 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0 ||  3 || &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt;011 || 011 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0 ||  4 || &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt;100 || 100 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || 0 ||  5 || &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt;101 || 101 &lt;br /&gt;
|-&lt;br /&gt;
|colspan=5|&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 6 || 12 || 0110 || 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 6 || 13 || 0111 || 1101&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 6 || 14 || 1000 || 1110&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 6 || 15 || 1001 || 1111&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To decode, read the first &amp;#039;&amp;#039;k&amp;#039;&amp;#039; bits. If they encode a value less than &amp;#039;&amp;#039;u&amp;#039;&amp;#039;, decoding is complete. Otherwise, read an additional bit and subtract &amp;#039;&amp;#039;u&amp;#039;&amp;#039; from the result.&lt;br /&gt;
&lt;br /&gt;
==Example with &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 7==&lt;br /&gt;
Here is a more extreme case: with &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 7 the next power of 2 is 8, so &amp;#039;&amp;#039;k&amp;#039;&amp;#039; = 2 and &amp;#039;&amp;#039;u&amp;#039;&amp;#039; = 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; − 7 = 1:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Input&amp;lt;br/&amp;gt;value !! Offset !! Offset&amp;lt;br /&amp;gt;value !! Standard&amp;lt;br/&amp;gt;binary || Truncated&amp;lt;br /&amp;gt;binary&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || &amp;lt;del&amp;gt;0&amp;lt;/del&amp;gt;00 || 00 &lt;br /&gt;
|-&lt;br /&gt;
|colspan=5|&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 2 || 001 || 010&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 || 3 || 010 || 011&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 1 || 4 || 011 || 100&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 || 5 || 100 || 101&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1 || 6 || 101 || 110&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 || 7 || 110 || 111&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This last example demonstrates that a leading zero bit does not always indicate a short code; if &amp;#039;&amp;#039;u&amp;#039;&amp;#039; &amp;lt; 2&amp;lt;sup&amp;gt;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;lt;/sup&amp;gt;, some long codes will begin with a zero bit.&lt;br /&gt;
&lt;br /&gt;
== Simple algorithm ==&lt;br /&gt;
&lt;br /&gt;
Generate the truncated binary encoding for a value &amp;#039;&amp;#039;x&amp;#039;&amp;#039;, 0 ≤ &amp;#039;&amp;#039;x&amp;#039;&amp;#039; &amp;lt; &amp;#039;&amp;#039;n&amp;#039;&amp;#039;, where &amp;#039;&amp;#039;n&amp;#039;&amp;#039; &amp;gt; 0 is the size of the alphabet containing &amp;#039;&amp;#039;x&amp;#039;&amp;#039;. &amp;#039;&amp;#039;n&amp;#039;&amp;#039; need not be a power of two.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
string TruncatedBinary (int x, int n)&lt;br /&gt;
{&lt;br /&gt;
	// Set k = floor(log2(n)), i.e., k such that 2^k &amp;lt;= n &amp;lt; 2^(k+1).&lt;br /&gt;
	int k = 0, t = n;&lt;br /&gt;
	while (t &amp;gt; 1) { k++;  t &amp;gt;&amp;gt;= 1; }&lt;br /&gt;
&lt;br /&gt;
	// Set u to the number of unused codewords = 2^(k+1) - n.&lt;br /&gt;
	int u = (1 &amp;lt;&amp;lt; k + 1) - n;&lt;br /&gt;
&lt;br /&gt;
	if (x &amp;lt; u)&lt;br /&gt;
        return Binary(x, k); &lt;br /&gt;
    else&lt;br /&gt;
        return Binary(x + u, k + 1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The routine &amp;lt;code&amp;gt;Binary&amp;lt;/code&amp;gt; is expository; usually just the rightmost &amp;lt;code&amp;gt;len&amp;lt;/code&amp;gt; bits of the variable &amp;#039;&amp;#039;x&amp;#039;&amp;#039; are desired.&lt;br /&gt;
Here we simply output the binary code for &amp;#039;&amp;#039;x&amp;#039;&amp;#039; using &amp;lt;code&amp;gt;len&amp;lt;/code&amp;gt; bits, padding with high-order 0s if necessary.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
string Binary (int x, int len)&lt;br /&gt;
{&lt;br /&gt;
	string s = &amp;quot;&amp;quot;;&lt;br /&gt;
	while (x != 0) {&lt;br /&gt;
		if (even(x))&lt;br /&gt;
            s = &amp;#039;0&amp;#039; + s;&lt;br /&gt;
		else  s = &amp;#039;1&amp;#039; + s;&lt;br /&gt;
		&lt;br /&gt;
		x &amp;gt;&amp;gt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	while (s.Length &amp;lt; len)&lt;br /&gt;
        s = &amp;#039;0&amp;#039; + s;&lt;br /&gt;
	return s;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== On efficiency ==&lt;br /&gt;
If &amp;#039;&amp;#039;n&amp;#039;&amp;#039; is not a power of two, and &amp;#039;&amp;#039;k&amp;#039;&amp;#039;-bit symbols are observed with probability &amp;#039;&amp;#039;p&amp;#039;&amp;#039;, then (&amp;#039;&amp;#039;k&amp;#039;&amp;#039; + 1)-bit symbols are observed with probability 1 − &amp;#039;&amp;#039;p&amp;#039;&amp;#039;. We can calculate the expected number of bits per symbol &amp;lt;math&amp;gt;b_e&amp;lt;/math&amp;gt; as&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;b_e = p k + (1 - p) (k + 1).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Raw encoding of the symbol has &amp;lt;math&amp;gt;b_u = k + 1&amp;lt;/math&amp;gt; bits. Then relative space saving &amp;#039;&amp;#039;s&amp;#039;&amp;#039; (see [[Data compression ratio]]) of the encoding can be defined as&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;s = 1 - \frac{b_e}{b_u} = 1 - \frac{p k + (1 - p) (k + 1)}{k + 1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When simplified, this expression leads to&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;s = \frac{p}{k + 1} = \frac{p}{b_u}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This indicates that relative efficiency of truncated binary encoding increases as probability &amp;#039;&amp;#039;p&amp;#039;&amp;#039; of &amp;#039;&amp;#039;k&amp;#039;&amp;#039;-bit symbols increases, and the raw-encoding symbol bit-length &amp;lt;math&amp;gt;b_u&amp;lt;/math&amp;gt; decreases.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Benford&amp;#039;s law]]&lt;br /&gt;
* [[Golomb coding]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Truncated Binary Encoding}}&lt;br /&gt;
[[Category:Entropy coding]]&lt;br /&gt;
[[Category:Lossless compression algorithms]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Steel1943</name></author>
	</entry>
</feed>