Как уже упоминалось, это может помочь не реализовать алгоритм CRC, но решить ваш конкретный запрос о помощи, чтобы вы знали, как это сделать в будущем. Я включу ответ.
Простойway
Один простой, но несколько неэффективный способ повторять pAr
снова и снова по мере необходимости - это цикл до конца mAr
вместо pAr
и использование %
в индексе для его уменьшенияк чему-то в pAr
:
for (int i = 0; i < mAr.length; i++) {
mAr[i] = mAr[i] ^ pAr[i % pAr.length];
}
Более эффективный способ
Что-то более сложное, но, вероятно, более эффективное (так как предсказание ветвления здесь, вероятно, будет работать правильно большую часть времени, пока деление не даетмодуль медленный):
for (int i = 0, j = 0; i < mAr.length; i++) {
mAr[i] = mAr[i] ^ pAr[j];
j++;
if (j == pAr.length) {
j = 0;
}
}
Использование ^=
, чтобы сделать вещи немного более читабельными
Так же, как вы можете использовать +=
, также доступно ^=
, чтоне только короче, но и помогает читателю очень быстро узнать, что mAr[i]
эффективно находится слева и справа от знака равенства, не тратя дополнительное время на размышления, чтобы обнаружить, что:
for (int i = 0; i < mAr.length; i++) {
mAr[i] ^= pAr[i % pAr.length];
}
for (int i = 0, j = 0; i < mAr.length; i++) {
mAr[i] ^= pAr[j];
j++;
if (j == pAr.length) {
j = 0;
}
}