Артишок101 спросил это :
Допустим, у меня есть массив из 4 32-разрядных целых чисел, который я использую для хранения 128-разрядного числа
Как мне выполнить сдвиг влево и вправо для этого 128-битного числа? "
Мой вопрос связан с ответом, который Ремус Русану дал:
void shiftl128 (
unsigned int& a,
unsigned int& b,
unsigned int& c,
unsigned int& d,
size_t k)
{
assert (k <= 128);
if (k > 32)
{
a=b;
b=c;
c=d;
d=0;
shiftl128(a,b,c,d,k-32);
}
else
{
a = (a << k) | (b >> (32-k));
b = (b << k) | (c >> (32-k));
c = (c << k) | (d >> (32-k));
d = (d << k);
}
}
void shiftr128 (
unsigned int& a,
unsigned int& b,
unsigned int& c,
unsigned int& d,
size_t k)
{
assert (k <= 128);
if (k > 32)
{
d=c;
c=b;
b=a;
a=0;
shiftr128(a,b,c,d,k-32);
}
else
{
d = (c << (32-k)) | (d >> k); \
c = (b << (32-k)) | (c >> k); \
b = (a << (32-k)) | (b >> k); \
a = (a >> k);
}
}
Давайте просто сосредоточимся на одной смене, скажем, левой. В частности,
a = (a << k) | (b >> (32-k));
b = (b << k) | (c >> (32-k));
c = (c << k) | (d >> (32-k));
d = (d << k);
Как это сдвигает влево 128-битное число? Я понимаю, что такое сдвиг битов, << сдвигает биты влево, (8-разрядное число), например, 00011000, сдвиг влево 2 - это 01100000. То же самое относится к сдвигу вправо, но вправо. Тогда единственная «труба» | ИЛИ означает, что в результате будет любое 1 из 32-битных чисел. </p>
Как a = (a << k) | (b >> (32-k))
правильно сдвигает первую часть (32) 128-битного числа?