Minimum operations to get from one number to another Let's define a simple language that operates on a single 8-bit value.
It defines three bitwise operations (code explanation assumes 8-bit value variable):

! Negate the least significant bit (value ^= 1)
&lt; Wrapping left-shift (value = value &lt;&lt; 1 | value &gt;&gt; 7)
&gt; wrapping right-shift (value = value &gt;&gt; 1 | value &lt;&lt; 7)

Input:
Two 8-bit numbers, a and b. As they are 8-bit, you can alternatively take them as characters.
Output:
The shortest way to get from a to b, with the three operations defined above.
You can return a string or an array of characters, or define a constant, distinct values for each operation and return an array of those (yes, you could also say &lt; means &gt; and &gt; means &lt;), but please explain your output format in your answer.
If there are multiple, equally long ways, you can output any or all of them.
Rules:

You can submit a program or function
Standard loopholes apply
The submission with fewest bytes in each language wins (no answer will be accepted)

Solutions without brute-forcing (or at least not only brute-forcing) might get my upvote.
Test cases:
12, 13 =&gt; '!'
1, 2 =&gt; '&lt;'
254, 253 =&gt; '&lt;'
5, 5 =&gt; ''
98, 226 -&gt; '&lt;!&gt;'
64, 154 -&gt; '!&gt;!&gt;&gt;&gt;!&gt;'
177, 164 -&gt; '!&gt;&gt;!&gt;&gt;&gt;!'
109, 11 -&gt; '&gt;&gt;!&gt;!&gt;&gt;'
126, 92 -&gt; '!&gt;!&gt;!&gt;!&lt;' or '!&gt;!&gt;&gt;!&lt;!'
26, 85 -&gt; '&lt;!&lt;&lt;!&lt;!&lt;' or '&lt;!&lt;&lt;!&lt;!&gt;' or '&lt;!&lt;&lt;&lt;!&gt;!'
123, 241 -&gt; '!&gt;!&lt;&lt;!' or '&gt;!&lt;!&lt;!'
236, 50 -&gt; '&lt;&lt;!&lt;!&gt;' or '&lt;&lt;&lt;!&gt;!'
59, 246 -&gt; '&lt;&lt;!&gt;'
132, 95 -&gt; '!&lt;&lt;!&lt;!&lt;!'
74, 53 -&gt; '!&gt;&gt;&gt;!&gt;!'
171, 127 -&gt; '&lt;&lt;!&lt;&lt;!&lt;'
109, 141 -&gt; '!&gt;&gt;&gt;'
185, 92 -&gt; '!&gt;'
166, 201 -&gt; '!&lt;!&gt;&gt;&gt;' or '&lt;!&gt;!&gt;&gt;'
77, 155 -&gt; '&lt;!'
124, 181 -&gt; '!&lt;&lt;&lt;&lt;!&gt;&gt;' or '!&gt;&gt;&gt;&gt;!&gt;&gt;'
108, 85 -&gt; '!&lt;&lt;&lt;!&lt;!&lt;!&lt;' or '!&lt;&lt;&lt;!&lt;!&lt;!&gt;' or '!&lt;&lt;&lt;!&lt;&lt;!&gt;!' or '!&gt;&gt;&gt;!&gt;!&gt;!&lt;' or '!&gt;&gt;&gt;!&gt;!&gt;!&gt;' or '!&gt;&gt;&gt;!&gt;&gt;!&lt;!'
185, 144 -&gt; '&lt;!&lt;&lt;!&lt;!'
70, 179 -&gt; '&lt;&lt;&lt;!&lt;!&gt;' or '&lt;&lt;&lt;&lt;!&gt;!' or '&gt;&gt;&gt;&gt;!&gt;!'

Here is a program to generate a few more.
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.