Following my previous question einstellen, ich brauche die aus einem festen Bereich von Bits I die folgende Funktion verwendet, um einen Wert 1 zu erzeugen:einen Bitbereich in einer ordinalen
void MaskAddRange(UINT& mask, UINT first, UINT count)
{
mask |= ((1 << count) - 1) << first;
}
Wie jedoch entdeckt, es didn‘ t funktionieren korrekt für count = 32
. Das Ergebnis der 1 << count
in einem solchen Fall theoretisch ist nicht definiertes Verhalten (oder Ergebnis) und praktisch auf x86 es 1 ist, weil Verschiebung Operand Modulo 32.
behandelt ich diesen Ausdruck beheben wollen für richtig arbeiten Dieser Extremfall auch. Was ist der einfachste/nice/effizienteste Weg dies zu tun?
Die Handhabung dieses speziellen Fall über Verzweigung (if
, ?
) ist ein bisschen einfach, obwohl hässlich, und ich wette, es ist auch ineffizient.
Eine andere Möglichkeit besteht darin, den Verschiebeoperanden zu einem größeren Typ (64 Bit) zu fördern. Ich meine folgendes:
void MaskAddRange(UINT& mask, UINT first, UINT count)
{
mask |= (UINT(unsigned __int64(1) << count) - 1) << first;
}
Gibt es einen besseren Weg?
Warum nicht 'UINT (-1)'? –
@Kerrek SB: Wie? – valdo
Hmm. Können Sie eine einfache, kurze und prägnante Beschreibung des erforderlichen Verhaltens Ihrer Funktion hinzufügen? Ich würde es vorziehen, die Anforderungen aus dem betreffenden Code nicht rückentwickeln zu müssen. –