Einzelnen Beitrag anzeigen

Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: Aufrunden einer Zahl auf nächstes Vielfaches

  Alt 19. Aug 2011, 23:48
Auf 2^12 aufrunden (mit Bitschubserei):
Code:
BIT12 = 1 << 12
MASK11 = BIT12 - 1; // Bitmaske unterste 11 Bits
if (MASK11 & eingabe != 0) {
  ergebnis = (eingabe & ~MASK11) + BIT12;
} else {
  ergebnis = eingabe;
}
Mit der von Melfin genannten Signum-Funktion würde es so gehen:
Code:
BIT12 = 1 << 12
MASK11 = BIT12 - 1;
ergebnis = (eingabe & ~MASK11) + (sgn(eingabe & ~MASK11)) << 12;
Das geht beides allerdings nur mit positiven Zahlen gut.

EDIT: Das musste jetzt einfach sein
Delphi-Quellcode:
{$ASMMODE intel}
function roundUp4096(x: longword): longword; pascal;
const
  mask11: longword = (1 shl 12) - 1;
  not_mask11: longword = not ((1 shl 12) - 1);
begin
  asm
    mov edx, eax // eax = edx = x
    and eax, not_mask11
    xor ecx, ecx // clear ecx
    and edx, mask11
    setnz cl // cl = 1 if not zeroflag else 0
    shl ecx, 12
    add eax, ecx
  end;
end;
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (20. Aug 2011 um 00:59 Uhr)
  Mit Zitat antworten Zitat