> -- Евгений Темиргалеев писал(а):
> И какой смысл говорить о моём коде, когда я предложил сравнить алгоритмы. Разные алгоритмы для решения одной задачи. Вы могли перевести мой код на Си (я думал это и в уме можно), отформатировать как Вам нравится, и сравнивать.
У вас не только алгоритмы разные, они ещё и разные задачи решают. У вас более частный случай нежели тот что приведен в C99 коде.

Мне кажется, что вот так, чуточку наглядней и читабельней. Хотя и чуть менее эффективно:
## Код:
```
void encode(const char* const in, const size_t in_len, char* const out, const size_t out_len) {
    const unsigned long m1 = BIN24(11111100,00000000,00000000);
    const unsigned long m2 = BIN24(00000011,11110000,00000000);
    const unsigned long m3 = BIN24(00000000,00001111,11000000);
    const unsigned long m4 = BIN24(00000000,00000000,00111111);
    
    long value = 0;
    char* p_value = (char*)&value;    
    
    for (int i =0, j=0; i<in_len && j<out_len; i+=3, j+=4) {
        int i_shift = 0;
        value = 0;
        switch (in_len - i ) {
            default: 
            case 3: p_value[0] = in[i + i_shift++];
            case 2: p_value[1] = in[i + i_shift++];
            case 1: p_value[2] = in[i + i_shift++];
        }

        switch (out_len - j) {
            default: 
            case 4: out[j+3] = b64str[(value & m4) >> (6*0)  ];
            case 3: out[j+2] = b64str[(value & m3) >> (6*1)  ];
            case 2: out[j+1] = b64str[(value & m2) >> (6*2)  ];
            case 1: out[j+0] = b64str[(value & m1) >> (6*3)  ];
        }        
    }
    
    if (in_len/3 < out_len/4)
        switch (in_len%3) {
            case 1: out[in_len*4/3+2]='=';
            case 2: out[in_len*4/3+1]='=';
        }
}
```

По крайней мере, читабельней мне.