Programim dhe zhvillim, javascript, python, php, html

Në C, si të vendosni tetë bitet e para të çdo int madhësie në një mënyrë të përgjithshme

Si mund t'i vendos tetë bitet e para (më pak të rëndësishme) të çdo lloji të numrit të plotë në të gjitha zero? Në thelb bëni një AND të çdo lloji të plotë me 0x00.

Ajo që më nevojitet është një zgjidhje e përgjithshme që funksionon në çdo madhësi të plotë, por nuk duhet të krijoj një maskë duke vendosur të gjitha bitet më të larta në 1.

Me fjale te tjera:

0xffff             & 0x00 = 0xff00
0xaabbccddeeffffff & 0x00 = 0xaabbccddeeffff00
18.01.2021

  • Unë mendoj se madhësia e numrit të plotë është gjithmonë më e madhe 1 bajt 18.01.2021
  • the first 8 bits vetëm për të qenë të sigurt, 8 bitet e para janë bitet më pak domethënëse? 18.01.2021
  • 8 bitet e para do të thotë 0 deri në 7 apo 31 deri në 24 ? 18.01.2021
  • Bazuar në të dhënat e mostrës, OP dëshiron të zero tetë bitët më pak të rëndësishëm. 18.01.2021

Përgjigjet:


1

Zgjidhja më e thjeshtë funksionon për të gjitha llojet e numrave të plotë në arkitekturat me paraqitjen e plotësimit 2 për numrat negativë:

val = val & ~0xff;

Arsyeja është ~0xff vlerëson në -256 me llojin int. Le të shqyrtojmë të gjitha llojet e mundshme për val:

  • nëse lloji i val është më i vogël se int, val promovohet në int, operacioni i maskës funksionon siç pritej dhe rezultati kthehet përsëri në llojin val.
  • nëse tipi i val është i nënshkruar, -256 konvertohet në llojin val duke ruajtur vlerën e tij, duke replikuar kështu bitin e shenjës dhe maska ​​kryhet siç duhet.
  • Nëse lloji i val është i panënshkruar, konvertimi i -256 në këtë lloj prodhon vlerën TYPE_MAX + 1 - 256 që i ka vendosur të gjithë bitat përveç 8 biteve të ulëta, përsëri maskën e duhur për operacionin.

Një zgjidhje tjetër e thjeshtë që funksionon për të gjitha paraqitjet e vlerave negative është kjo:

val = val ^ (val & 0xff);

Kërkon ruajtjen e vlerës në një variabël për të shmangur vlerësimin e shumëfishtë, ndërsa propozimi i parë mund të zbatohet për çdo shprehje me efekte anësore të mundshme:

return my_function(a, b, c) & ~0xff;
18.01.2021

2

Me ndërrime bit:

any_unsigned_integer = any_unsigned_integer >> 8 << 8;
18.01.2021
  • Propozimi juaj i dytë nuk do të funksiononte për unsigned long long nëse ky lloj është më i madh se unsigned long. any_unsigned_integer &= ~0xffull; është më mirë, por ende nuk do të funksiononte për një uint128_t nëse është e disponueshme. 18.01.2021
  • @chqrlie: Unë mendoj se KamilCuk mund të ketë sugjeruar që të përdorni një lloj maske të përshtatshme për variablin që modifikohet, jo gjithmonë unsigned long. Prandaj (uint128_t)0xff për variablat e tipit unit128_t. 19.01.2021
  • @paxdiablo: ky nuk është leximi im i Ajo që më nevojitet është një zgjidhje e përgjithshme që funksionon në çdo madhësi të plotë, por nuk duhet të krijojë një maskë duke vendosur të gjitha bitet më të larta në 1. Një zgjidhje e përgjithshme duhet të funksionojë në çdo masë të numrit të plotë. e pamodifikuar për të gjitha llojet, dhe besoj se një zgjidhje e tillë ekziston dhe është e thjeshtë. 19.01.2021

  • 3

    Operatori jo C ~ do të përmbysë të gjithë bitat e një vlere të caktuar, në mënyrë që të marrë një maskë që do të pastrojë vetëm tetë bitet e poshtme:

    int val = 123456789;
    int other_val = val & ~0xff; // AND with binary 1111 ... 1111 0000 0000
    val &= ~0xff;                // alternative to change original variable.
    

    Nëse keni një lloj më të gjerë (ose më të hollë), 0xff duhet të jetë i llojit të duhur, për shembull:

    long val = 123456789L;
    long other_val = val & ~(long)0xff;
    val &= ~(long)0xff;          // alternative to change original variable.
    
    18.01.2021
  • Rreshti i dytë i shembujve tuaj nuk ka kuptim. Ato janë deklarata të variablave (të uninializuara) mbi të cilat kryeni operacione në kohë ekzekutimi. 18.01.2021
  • @Paul, po, fillimisht kisha value &= blah por i ndryshova për të mos ndikuar në variablin origjinal. Keq, siç doli :-) Rregulluar tani. 18.01.2021

  • 4

    Një mënyrë për ta bërë këtë pa krijuar një maskë për bitet më të larta është përdorimi i një kombinimi të operatorëve & dhe ^: x = x ^ (x & 0xFF); (ose, duke përdorur caktimin e përbërë: x ^= x & 0xFF;).

    18.01.2021
  • 0xff është në fakt maska, kështu që without a creating a mask nuk është e vërteta. 18.01.2021
  • @0___________ Maska është për pjesët e poshtme që po ndërrohen. Unë besoj se kërkesa është që maska ​​të mos ketë pjesë më të larta të vendosura në 1. 18.01.2021

  • 5

    Zgjidhje universale pa maskë, asnjë numër pjesësh

    #define RESETB(val, nbits) ((val) ^ ((val) & ((1ULL << (nbits)) - 1)))
    

    apo edhe më mirë

    #define RESETB(val, nbits) ((val) ^ ((val) & ((nbits) ? ((nbits) >= sizeof(val) * CHAR_BIT ? ((1ULL << (sizeof(val) * CHAR_BIT)) - 1) : ((1ULL << (nbits)) - 1)) : 0)))
    
    
    18.01.2021
  • @chqrlie Në të vërtetë, nuk lexova me kujdes mjaftueshëm, i ndryshuar 18.01.2021
  • Këto makro do të vlerësojnë dy herë argumentin e tyre të parë. 18.01.2021
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..