Decoding 32-bit MIPS instructions
Since the instruction is a 32-bit number, you should use uint32_t, rather than assuming that unsigned is 32 bits on the host.

The first version is fine, I think, because it has the least clutter.  An experienced programmer will have no problem figuring out what it does.  If you are concerned about the mental arithmetic required to figure out the width of the bitmasks, you could write it like this:

void instruction_partition(uint32_t instruction, unsigned *op, unsigned *r1, unsigned *r2, unsigned *r3, unsigned *funct, unsigned *offset, unsigned *jsec)
{
    assert(op &amp;&amp; r1 &amp;&amp; r2 &amp;&amp; r3 &amp;&amp; funct &amp;&amp; offset &amp;&amp; jsec);

    *op     = (instruction &gt;&gt; 26) &amp; ((1 &lt;&lt; 6) - 1); /* 6 most significant bits */
    *r1     = (instruction &gt;&gt; 21) &amp; ((1 &lt;&lt; 5) - 1);
    *r2     = (instruction &gt;&gt; 16) &amp; ((1 &lt;&lt; 5) - 1);
    *r3     = (instruction &gt;&gt; 11) &amp; ((1 &lt;&lt; 5) - 1);
    *offset = (instruction &gt;&gt;  6) &amp; ((1 &lt;&lt; 5) - 1);
    *funct  =  instruction        &amp; ((1 &lt;&lt; 6) - 1); /* 6 least significant bits */
    *jsec   =  instruction        &amp; ((1 &lt;&lt; 26) - 1);
}


This should compile to identical code as your first implementation.  Technically, the opcode doesn't need to be masked:

    *op = instruction &gt;&gt; 26;