Artischocke101 fragte dies :
Angenommen, ich habe ein Array mit 4 32-Bit-Ganzzahlen, die ich zum Speichern der 128-Bit-Zahl verwende
Wie kann ich bei dieser 128-Bit-Zahl eine Links- und Rechtsverschiebung durchführen?"
Meine Frage bezieht sich auf die Antwort, die Remus Rusanu gegeben hat:
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);
}
}
Konzentrieren wir uns auf eine Schicht, sagen wir die linke Schicht. Genauer gesagt,
a = (a << k) | (b >> (32-k));
b = (b << k) | (c >> (32-k));
c = (c << k) | (d >> (32-k));
d = (d << k);
Wie wird die 128-Bit-Zahl dadurch nach links verschoben? Ich weiß, was Bit-Shifting ist, << verschiebt Bits nach links, (8-Bit-Zahl) wie 00011000 links verschoben 2 ist 01100000. Dasselbe gilt für die Rechtsverschiebung, aber nach rechts. Dann ist die einzelne "pipe" | ODER, was bedeutet, dass jede 1 in jeder 32-Bit-Zahl im Ergebnis enthalten ist.
Wie ist a = (a << k) | (b >> (32-k))
den ersten Teil (32) der 128-Bit-Zahl korrekt zu verschieben?