LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

Ну раз анонимус хочет, чтобы я на этот код как-то отреагировал...

Не совсем понятно, зачем тут нужны сдвиги на 3 :

int o = (b*i)>>3; int d = b*i-(o<<3);

И не совсем понятно, почему я не вижу операции деления / и нахождения остатка от деления %. Например если взять массив из 8-битных char и упаковывать в него 3-битные числа, то чтобы получить десятое 3-битное число, надо было бы сделать следующее: умножить 3 на 10 (получим 30), разделить 30 на 8 нацело (получим 3) и найти остаток от деления 30 на 8 (получим 6). Это значит что десятое по счету 3-битное число в 3 байте, со сдвигом 6. Если ничего не напутал.

Вот эта вот часть ((*(int64_t*)(a+o))&mask)>>d и (*(int64_t*)(a+o))&= ~mask; наводит меня на мысль, что тут чтение-запись uint64_t может производиться не по выравненным под 8 байт адресам. Для некоторых архитектур (в частности ARM) необходимо, чтобы обращения к памяти имели естественное выравнивание, т.е. адрес памяти должен быть кратен размеру данных (2 для short, 4 для int, 8 для uint64_t и double).

Исходная версия SZT, :

Ну раз анонимус хочет, чтобы я на этот код как-то отреагировал...

Не совсем понятно, зачем тут нужны сдвиги на 3 :

int o = (b*i)>>3; int d = b*i-(o<<3);

И не совсем понятно, почему я не вижу операции деления / и нахождения остатка от деления %. Например если взять массив из 8-битных char и упаковывать в него 3-битные числа, то чтобы получить десятое 3-битное число, надо было бы сделать следующее: умножить 3 на 10 (получим 30), разделить 30 на 8 нацело (получим 3) и найти остаток от деления 30 на 8 (получим 6). Это значит что десятое по счету 3-битное число в 3 байте, со сдвигом 6. Если ничего не напутал.

Вот эта вот часть ((*(int64_t*)(a+o))&mask)>>d наводит меня на мысль, что тут чтение-запись uint64_t может производиться не по выравненным под 8 байт адресам. Для некоторых архитектур (в частности ARM) необходимо, чтобы обращения к памяти имели естественное выравнивание, т.е. адрес памяти должен быть кратен размеру данных (2 для short, 4 для int, 8 для uint64_t и double).