GTA Közösség - A magyar GTA fórum
San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Segítségkérés => A témát indította: kurta999 - 2012. február 15. - 17:10:26
-
Na én azt szeretném megcsinálni, hogy lekérni egy szám UTOLSÓ bitjét, ami igaz.
Tehát ha a szám így néz ki binárisan: 0b011001000, akkor az \"utolsó 1-es pozíciójával\" térjen vissza, az jelen esetben 6.
Próbáltam a FindMSB-t, de az nem éppen azt csinálja, amire nekem lenne szükségem.
Valakinek valami ötlet?
A következõ megoldást próbáltam, de ez ugyanazt a hülyeséget csinálja, mint a FindMSB.
[pawn]
for(new i; i < 32; i++)
{
printf(\"%d\", iMyVal & (1 << i));
if(iMyVal & (1 << i))
{
iMaxPos = i;
}
}
// By Slice
stock FindMSB(iInput) {
// http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn
static const
aiDeBruijnBitPositionsPacked[32 char] = {
0x0A010900,
0x1D02150D,
0x12100E0B,
0x1E031916,
0x1C140C08,
0x0718110F,
0x06171B13,
0x1F04051A
}
;
if (iInput) {
#emit LOAD.S.pri iInput
#emit MOVE.alt
#emit SHR.C.alt 1
#emit OR
#emit MOVE.alt
#emit SHR.C.alt 2
#emit OR
#emit MOVE.alt
#emit SHR.C.alt 4
#emit OR
#emit MOVE.alt
#emit SHR.C.alt 8
#emit OR
#emit MOVE.alt
#emit SHR.C.alt 16
#emit OR
#emit CONST.alt 0x07C4ACDD
#emit UMUL
#emit SHR.C.pri 27
#emit ADD.C aiDeBruijnBitPositionsPacked
#emit LODB.I 1
#emit RETN
}
return -1;
}
[/pawn]
-
És ha beletennéd egy stringbe? (Egy ciklusban a max értéket a string hosszúságra állítod és megvizsgálod h a stringben a ciklus változóján szereplõ karaktert h az 1es-e)
-
Na pont az az, hogy nem úgy akarom ezt csinálni :D
Az feleslegesen lassítaná és bonyolítaná a kódot.
-
Rendben, más ötletem nincs, annyira azért nem értek hozzá :D
-
Hát nem tudom de itt szerintem a hatodik bit az 0 és nem 1.
[pawn] printf(\"%d\", 0b011001000);
printf(\"%d\", 0b11001000);[/pawn]
Bitek sorrendje jobbról balra értendõ ezt a fenti példa is bizonyítja, mind két esetben a kinyomtatott érték az 200.
A legelsõ bit értéke eldönti hogy páros vagy páratlan számmal van-e dolgunk. Mivel itt a legelsõ bit az 0 ezért páros szám van a példában.
[pawn]
new
value = 0b11001000;
if(value & 0b1)
{
printf(\" %d páratlan\", value);
} else {
printf(\" %d páros\", value);
}
[/pawn]
-
Meg**szom és megy a FindMSB O_o
Kösz, úgy ahogy megvan, amit szerettem volna.
A témát még nem zárom, mert lehet, hogy még lessz hozzá kérdésem.