Hey,
Angenommen ich speichere einen Integer und schneide die führenden nullen ab, wie ermittle ich am effizientesten die übrig gebliebene Bitlänge?
Vorschlag:
Vielleicht hilft auch mein Anwendungszweck, um den Sinn dahinter zu sehen.
Ich habe zwei Arrays, sagen wir einfach
Meine Idee zu mod_arr() ist: Berechne B - C so lange, wie B > C. Danach bestimmte die fehlenden Bits von links, d.h. Sum(i=0, n) bitlength(B[11-i]); sobald die erste bitlength > 0 ist, breche ab*. Speichere die fehlenden Bits an der Abbruchstelle und die Summe aller fehlenden Bits. Shifte B um die Summe aller Bits nach links, sodass B die Form [0b1....|0b01...|...|0b0|...|0b0] hat. Befülle die fehlenden Stellen mit A. Linksshifte A um die selbe Anzahl der Stellen. So hat A geht A gegen 0.
Dieses Vorgehen wird so lange wiederholt, wie A != 0 und B > C. Speichere anschließend das Ergebnis in C.
Wie man meiner Beschreibung nach sieht, benötige ich dafür die Operationen: bitlength, sum_bitlength, shift_left, fill_right, compare.
Ich habe aber das Gefühl, dass mein Vorgehen nicht sonderlich effizient ist, um mein Ziel zu erreichen.
* bei Constant-Time Implementation würde ich ab dieser Stelle einen anderen Counter erhöhen und n von Beginn an bei 11 belassen.
Angenommen ich speichere einen Integer und schneide die führenden nullen ab, wie ermittle ich am effizientesten die übrig gebliebene Bitlänge?
Vorschlag:
Code:
void bitlength(uint32_t t, uint32_t *counter)
{
*counter = 0;
while(t <<= 1){
*counter += 1;
}
}
Vielleicht hilft auch mein Anwendungszweck, um den Sinn dahinter zu sehen.
Ich habe zwei Arrays, sagen wir einfach
Code:
typedef uint32_t arr[12];
const arr C;
void mod_arr()
{
//intepretiere B . A ( . bezeichnet Concatenation)
//berechne B . A mod C
//speichere in A
}
void main()
{
arr A,B;
mod_arr(A,B);
}
Meine Idee zu mod_arr() ist: Berechne B - C so lange, wie B > C. Danach bestimmte die fehlenden Bits von links, d.h. Sum(i=0, n) bitlength(B[11-i]); sobald die erste bitlength > 0 ist, breche ab*. Speichere die fehlenden Bits an der Abbruchstelle und die Summe aller fehlenden Bits. Shifte B um die Summe aller Bits nach links, sodass B die Form [0b1....|0b01...|...|0b0|...|0b0] hat. Befülle die fehlenden Stellen mit A. Linksshifte A um die selbe Anzahl der Stellen. So hat A geht A gegen 0.
Dieses Vorgehen wird so lange wiederholt, wie A != 0 und B > C. Speichere anschließend das Ergebnis in C.
Wie man meiner Beschreibung nach sieht, benötige ich dafür die Operationen: bitlength, sum_bitlength, shift_left, fill_right, compare.
Ich habe aber das Gefühl, dass mein Vorgehen nicht sonderlich effizient ist, um mein Ziel zu erreichen.
* bei Constant-Time Implementation würde ich ab dieser Stelle einen anderen Counter erhöhen und n von Beginn an bei 11 belassen.
Zuletzt bearbeitet: