You can, but that is non-portable code relying on implementation-defined details, and IMHO very bad style. If you want to send the data over the network or save it into a file, the program will not be able to communicate with another instance of itself built on a arch with different endianness.
Since it relies on architecture details, my guess is: you can not, unless you use raw pointers inside unsafe blocks.
Did you check? You may know that bitfields are often disliked by hackers and often not very optimized by compilers. Now, I did check (gcc 4.9.3-3 x86_64), and this case is lucky: the non-portable solution produces exactly the same code than the portable solution, namely:
unsigned arg = w & 0xFFFFFF;
unsigned cmd = w >> 24;
The exact same solution, of course, works with Rust.
Possibly. Remember that macros are bad at counting, so you may have some trouble making masks, but don't let that discourage you. I did once implement a horrific macro for this, but it seems to have been lost in time and I can't find where I posted it. Maybe that's just for the better...