Minimum operations to get from one number to another
JavaScript (ES6), 100 96 86 bytes



f=(a,b,[c,d,...e]=[a,''])=&gt;c-b?f(a,b,[...e,c^1,d+1,c/2|c%2&lt;&lt;7,d+2,c%128*2|c&gt;&gt;7,d+0]):d
&lt;div oninput=o.textContent=f(a.value,b.value).replace(/./g,c=&amp;gt;`&amp;lt;!&amp;gt;`[c])&gt;a: &lt;input type=number min=0 max=255 value=0 id=a&gt; b: &lt;input type=number min=0 max=255 value=0 id=b&gt;&lt;pre id=o&gt;




Somewhat slow breadth-first search without double-checking. Slightly more efficient 114-byte version:



f=(a,b,c=[],[d,e,...g]=[a,''])=&gt;c[d]?f(a,b,c,g):d-b?f(a,b,c,[...g,d^1,c[d]=e+1,d/2|d%2&lt;&lt;7,e+2,d%128*2|d&gt;&gt;7,e+0]):e
&lt;div oninput=o.textContent=f(a.value,b.value).replace(/./g,c=&amp;gt;`&amp;lt;!&amp;gt;`[c])&gt;a: &lt;input type=number min=0 max=255 value=0 id=a&gt; b: &lt;input type=number min=0 max=255 value=0 id=b&gt;&lt;pre id=o&gt;




Both versions encode &lt;!&gt; as 012 but the snippets decode this for you. Edit: Saved 10 utterly useless bytes thanks to @RickHitchcock.