I second Majenko's points about just printing the bits separately if
possible, and avoiding String objects.
However, if you do need to build such a string (not String object, just
plain C string), you don't need sprintf(), which is quite a big
function: you can build the string character by character. For example:
char out[4]; // 3 + 1 char for the termination character
out[0] = out1==HIGH ? '1' : '0';
out[1] = out2==HIGH ? '1' : '0';
out[2] = out3==HIGH ? '1' : '0';
out[3] = '\0'; // add NUL termination
Serial.println(out);
This is using the ternary operator, which here means “if out1 is
HIGH, then use the character '1', otherwise use '0'”.
Now, it just happens that in Arduino HIGH means 1 and LOW means 0.
And single digit numbers can be converted into character by just adding
the numeric code of character “0”, which is 48 but can written as '0'
in C++. Thus you can write:
out[0] = out1 + '0'; // convert number to character
And you can put all together as:
char out[4]; // 3 + 1 char for the termination character
out[0] = digitalRead(r1) + '0';
out[1] = digitalRead(r2) + '0';
out[2] = digitalRead(r3) + '0';
out[3] = '\0'; // add NUL termination
Serial.println(out);