Я рекомендую что-то более явное, в котором не используются циклы, потому что у вас, кажется, есть только небольшое количество битов для проверки. Если это необходимо масштабировать до десятков тысяч битов, то обязательно используйте циклы.
Я также предполагаю, что у вас есть веская причина использовать глобальные переменные и символьные массивы фиксированной длины.
Вот что я бы сделал:
char FinalString[60];
void ConcatBitLabel(char ** str, u16 data, u16 bitMask, const char * label)
{
if (data & bitMask)
{
// append spaces for strlen(label)
while (*label) { *((*str)++) = ' '; label++; }
}
else
{
// append the label
while (*label) { *((*str)++) = *label; label++; }
}
}
void MakeBitString(u16 data, u16 dataExt)
{
char * strPtr = FinalString;
ConcatBitLabel(&strPtr, dataExt, 0x0001, "X");
ConcatBitLabel(&strPtr, dataExt, 0x0002, "Y");
ConcatBitLabel(&strPtr, data, 0x0001, "A");
ConcatBitLabel(&strPtr, data, 0x0002, "B");
ConcatBitLabel(&strPtr, data, 0x0004, "Sl");
ConcatBitLabel(&strPtr, data, 0x0008, "St");
ConcatBitLabel(&strPtr, data, 0x0010, "R");
ConcatBitLabel(&strPtr, data, 0x0020, "L");
ConcatBitLabel(&strPtr, data, 0x0040, "U");
ConcatBitLabel(&strPtr, data, 0x0080, "D");
ConcatBitLabel(&strPtr, data, 0x0100, "RS");
ConcatBitLabel(&strPtr, data, 0x0200, "LS");
*strPtr = 0; // terminate the string
}