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;