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

Cím: Lekéni a legutolsó bitet, ami igaz
Írta: 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]
Cím: Lekéni a legutolsó bitet, ami igaz
Írta: 1ST_Chr - 2012. február 15. - 18:05:53
É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)
Cím: Lekéni a legutolsó bitet, ami igaz
Írta: kurta999 - 2012. február 15. - 18:10:17
Na pont az az, hogy nem úgy akarom ezt csinálni :D
Az feleslegesen lassítaná és bonyolítaná a kódot.
Cím: Lekéni a legutolsó bitet, ami igaz
Írta: 1ST_Chr - 2012. február 15. - 18:12:11
Rendben, más ötletem nincs, annyira azért nem értek hozzá  :D
Cím: Lekéni a legutolsó bitet, ami igaz
Írta: Zsolesszka - 2012. február 15. - 18:34:46
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]
Cím: Lekéni a legutolsó bitet, ami igaz
Írta: kurta999 - 2012. február 15. - 19:08:48
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.