2012-02-29 3 views
0

Я пытался разобрать их пару дней, и я не могу это понять. Вот они:Что именно делают эти 3 строки кода C?

int left = S->buflen >> 3; 
int fill = 64 - left; 
if(left && (((datalen >> 3) & 0x3F) >= (unsigned)fill)){ 
    some code here 
} 

Если это помогает, это в эталонной реализации SHA-3 кандидата BLAKE256.

+0

Что вы не понимаете? Какие побитовые операторы? –

+0

Нет, я понимаю, что побитовые операторы просто прекрасны. Часть, которая меня действительно сбивает с толку, делит «datalen» на 8 и ANDing результат с «00111111». – pg1989

ответ

6

Альтернатива без bitops может помочь прояснить смысл:

int left = S->buflen/8; 
int fill = 64 - left; 
if (left != 0) { 
    int tmp = datalen/8; 
    if ((tmp % 64) >= (unsigned)fill) { 
     /* Some code here */ 
    } 
} 

Это, конечно, предполагает, что buflen и datalen неотрицательны, так как оператор правого сдвига имеет зависимую от платформы поведения для отрицательных чисел.

1
int left = S->buflen >> 3; 

Получить количество байт слева, предполагая buflen является измерение в битах.

int fill = 64 - left; 

Получить количество байт, которые вы будете поэтому нужно приложить округлить до кратного 64. Следует отметить, что если S->buflen 0 вы будете в конечном итоге добавив целую 64 байта, когда вам не нужно добавить любого, так что ...

if(left && (((datalen >> 3) & 0x3F) >= (unsigned)fill)){ 
    some code here 
} 

... сделать код здесь, только если были какие-то биты слева и datalen, преобразованные из бит в байты, по модулю 64, по меньшей мере равен числу дополнительных байт вам нужно написать. Предположительно, потому что datalen является максимальным размером вывода?

+0

Oh shit, '& 0x3F' эквивалентно mod64? – pg1989

+2

Да - так же, как взятие последних двух цифр базового номера 10 совпадает с моментом 100, взятие последних шести цифр двоичного числа (по ANDing) совпадает с модом 64. – Tommy

+0

Хороший бог, я чувствую себя как шут. Это так просто ... – pg1989

Смежные вопросы