Szerző Téma: Lekéni a legutolsó bitet, ami igaz  (Megtekintve 833 alkalommal)

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
Lekéni a legutolsó bitet, ami igaz
« Dátum: 2012. február 15. - 17:10:26 »
0 Show voters
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]

Lekéni a legutolsó bitet, ami igaz
« Válasz #1 Dátum: 2012. február 15. - 18:05:53 »
0 Show voters
É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)

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
Lekéni a legutolsó bitet, ami igaz
« Válasz #2 Dátum: 2012. február 15. - 18:10:17 »
0 Show voters
Na pont az az, hogy nem úgy akarom ezt csinálni :D
Az feleslegesen lassítaná és bonyolítaná a kódot.

Lekéni a legutolsó bitet, ami igaz
« Válasz #3 Dátum: 2012. február 15. - 18:12:11 »
0 Show voters
Rendben, más ötletem nincs, annyira azért nem értek hozzá  :D

Lekéni a legutolsó bitet, ami igaz
« Válasz #4 Dátum: 2012. február 15. - 18:34:46 »
+1 Show voters
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]

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
Lekéni a legutolsó bitet, ami igaz
« Válasz #5 Dátum: 2012. február 15. - 19:08:48 »
0 Show voters
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.
« Utoljára szerkesztve: 2012. február 15. - 19:11:01 írta kurta999 »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal