Runden Sie eine Ganzzahl auf das nächste int, das kleiner oder gleich ist, und ein Vielfaches von 64

7

Wenn Sie eine Ganzzahl x angeben, wie würden Sie eine Ganzzahl y zurückgeben, die kleiner oder gleich x und ein Vielfaches von 64 ist?

    
idealistikz 05.05.2010, 02:01
quelle

6 Antworten

17

Simply and it mit der Bit-Umkehrung von (64-1):

%Vor%

Dies löscht im Grunde die unteren sechs Bits, das ist dasselbe wie das Abrunden auf ein Vielfaches von 64. Beachten Sie, dass dies für negative Zahlen auf negative Unendlichkeit gerundet wird, nicht auf Null, aber das scheint Ihre Frage zu sein erfordert.

Sie können das Verhalten hier in dieser Multi-of-Four-Variante sehen:

%Vor%

Dies erzeugt:

%Vor%

Beachten Sie, dass dies nur für Potenzen von zwei (wie 2 6 = 64) und Zweierkomplement funktioniert (der ISO-Standard schreibt diese Darstellung nicht vor - siehe hier für Details - aber ich habe nie eine C-Umgebung gesehen das benutzt es nicht und ich habe an Systemen von den schwächsten 8051 bis zu den größten Mainframes gearbeitet). Wenn Sie eine andere Zahl für den Divisor verwenden möchten, sollten Sie wahrscheinlich die richtigen mathematischen Funktionen wie floor verwenden.

    
paxdiablo 05.05.2010, 02:04
quelle
5

Wo x die Zahl ist, die Sie auf das nächste Vielfache von n abrunden möchten, ist die Methode, die Sie benötigen:

%Vor%

was Sie wirklich schön in C ++ implementieren können (im Gegensatz zu C):

%Vor%     
icio 05.05.2010 02:02
quelle
3

(x >> 6) << 6
Zuerst 6 Bits nach rechts verschieben, dann links - untere Bits mit Nullen gefüllt.
Keine Probleme mit dem Zeichen

BEARBEITEN: Ich denke, dass die meisten Compiler x / 64 * 64 (und jede Division / Multiplikation mit kleinen Potenzen von 2) auf den gleichen Code optimieren werden, so dass bis dahin keine wirkliche Notwendigkeit für eine solche Bit-Magie besteht Sie möchten, dass Ihr Code wirklich cool aussieht :)

(Und AndreyT denkt, es gibt sogar noch bessere Optimierungen für direkten Code, lesen Sie Kommentare zu seinem Beitrag )

    
Alexander Malakhov 05.05.2010 02:29
quelle
2

Angenommen, Sie benötigen die nächste solche Ganzzahl und arbeiten mit positiven Zahlen:

%Vor%

Verschiedene Bit-Hacks sehen intresierend aus, aber in diesem speziellen Fall sind sie absolut nicht nötig.

    
AnT 05.05.2010 02:19
quelle
1
%Vor%     
Jeff Kelley 05.05.2010 02:04
quelle
1

Für nicht signierte Ints

%Vor%

Für signierte Ints

%Vor%

; -)

    
Plynx 05.05.2010 02:08
quelle

Tags und Links