Here's program 1 + source code. Drag file onto it, it will give you 1.bin and 2.bin. Note that not much testing was done. Tested it on its own source code and one other file.
Working on program 2, which you can basically consider done. It's just requires me to do a bit more actual testing since it's tougher to see if you get it right.
Edit: Forgot to free dynamically allocated memory, so I'll fix that. May as well check if the files are actually opened successfully while I'm at it. Will edit this post with new program/source in a second.
Edit2: Okay, that stuff is done, new program/source attached. Realized I could just read each byte instead of dynamically allocating memory for the entire file, but eh. outpos1 and outpos2 are unused... planned for another method. But eh once again.
Hopefully final edit: Another question about the 4 file program. Byte 0, Byte 2, Byte 4 etc only contain bits from file 0 and file 1, and Byte 1, Byte 3, Byte 5 etc only contain bits from file 2 and file 3, right?
And do you want just 4 bits of each file in each output byte or eight? I assume eight, but the example can be interpreted a few ways. Not trying to be obtuse, but you know how software is...