eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingz uczty - jak znaleźć maskę najstarszego bitu?z uczty - jak znaleźć maskę najstarszego bitu?
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
    atman.pl!.POSTED!not-for-mail
    From: Borneq <b...@a...hidden.pl>
    Newsgroups: pl.comp.programming
    Subject: z uczty - jak znaleźć maskę najstarszego bitu?
    Date: Thu, 3 Dec 2015 08:10:13 +0100
    Organization: ATMAN - ATM S.A.
    Lines: 42
    Message-ID: <n3opsf$6ep$1@node1.news.atman.pl>
    NNTP-Posting-Host: 91.239.205.105
    Mime-Version: 1.0
    Content-Type: text/plain; charset=utf-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: node1.news.atman.pl 1449126607 6617 91.239.205.105 (3 Dec 2015 07:10:07 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Thu, 3 Dec 2015 07:10:07 +0000 (UTC)
    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101
    Thunderbird/38.4.0
    X-Mozilla-News-Host: news://news.atman.pl:119
    Xref: news-archive.icm.edu.pl pl.comp.programming:208925
    [ ukryj nagłówki ]

    W książce "Uczta programistów" było wyszukiwanie numeru najstarszego
    zapalonego bajtu dla 32 bitowych liczb:

    ///return the most significant bit which is set, the same as BSR
    assembler opcode
    ///but assembler is not portable
    int find_set_bit(unsigned int x)
    {
    int n;
    if (x==0) return 0;
    n = 0;
    if (x<= 0x0000ffff) { n = n+16; x = x << 16; }
    if (x<= 0x00ffffff) { n = n+8; x = x << 8; }
    if (x<= 0x0fffffff) { n = n+4; x = x << 4; }
    if (x<= 0x3fffffff) { n = n+2; x = x << 2; }
    if (x<= 0x7fffffff) { n = n+1; }
    return 31-n;
    }


    Mam funkcję sprawdzającą czy jest tylko jeden zapalony bit dla dowolnego
    typu:
    /**
    return true if is only 1 or 0 set bits
    (for 0 retuns true)
    if is severeal set bits return false
    */
    #define isAlone(x) ((x & (x - 1))==0)

    Porównywanie z zerem potrzebne jest tylko dla tego aby z wyniku równego
    zero lub różnego od zera dawał poprawny boolean 0 lub 1

    Jeśli obchodzi nas nie numer ale maska, mamy łatwiej:
    /**
    return the least significant bit in x which is set
    not bit number, rather low bit mask
    */
    #define lowbit(x) ((x) & (~(x) + 1))

    A teraz pytanie: czy jest jakaś funkcja analogiczna highbit(x), która
    była by równie krótka co lowbit a różniła by się od find_set_bit tym, że
    dawała by nie numer ale od razu maskę?

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: