» »

[C] bitni operator

[C] bitni operator

«
1
2 3

ql000 ::

A uporaba bitnega operatorja (&) avtomatsko priredi odgovor if stavka?

Primer:
char int_reg;

if (int_reg & 0x01)  // odgovor true(?) četudi ni pogojnega izraza?

OwcA ::

Karkoli vržeš v oklepaje bo prevajalnik skušal prevesti v logično izjavo, torej ja.
Otroška radovednost - gonilo napredka.

ql000 ::

E, to ti je brzina! :D 8-O

Thomas ::

Probi tkole:

if (int_reg && 0x01)
Man muss immer generalisieren - Carl Jacobi

Fury ::

Thomas tole je pa pomoje butast predlog. Zakaj bi hotu to nardit? Tole je isto kot da napise if( int_reg )...

MaCoFaCo ::

if (karkoli_različno_od_nič) {} //true
else {} //false

Thomas ::

> Thomas tole je pa pomoje butast predlog.

Nekej drugega je butasto. Uganeš?
Man muss immer generalisieren - Carl Jacobi

Utk ::

Kaj je pa s starim dobrim == narobe?:)

Fury ::

@Thomas: To je pa tko ko se pogovarjas s tipom k gre v javi pisat sablanje za gejm in pol nc ne dela...

Thomas ::

Sam tko ... a to kako name leti al kaj? :\

Sicer pa, v C in C++ testiraš naprimer 5-ti bit x TOČNO na tale način if (x && 32) ...

Kdor tega ne ve in ne pozna ... se je lahko zdej naučil.
Man muss immer generalisieren - Carl Jacobi

MaCoFaCo ::

@Thomas: to kar si napisal je enakovredno stavku: if (x != 0)

Thomas ::

Ne, ni.

To je pač bitwise AND, ki NE spremeni vrednosti x-a. Samo če ima x na petem bitu 1, bo to večje od 0, sicer ne.

C in C++ sta smotkana v tem smislu, da ne podpirata direktnih testiranj bitov, pač pa je treba it na ta način.

Ja?
Man muss immer generalisieren - Carl Jacobi

MaCoFaCo ::

Bitwise AND je & in ne &&. Vlka razlika...

Thomas ::

Ja, ja, maš prav.

Tale && v C++ (v dialektih kjer pač obstaja) zreducira vrednost števila na 1 ali 0 in potem naredi operacijo AND.

Maš prav, jest mam narobe.
Man muss immer generalisieren - Carl Jacobi

Thomas ::

Sem se spomnu ja, da ker tako neumno dela tale dvojni ampersant, ga nismo vključili v Critticall.

Anpak to, da ni "nativnega" (direktnega) testiranja bitov v C(++) je pa povezana traparija. Ker testiranje in premikanje bitov je elementarna stvar. Potem pa ni podpore za to. Heh ...
Man muss immer generalisieren - Carl Jacobi

MaCoFaCo ::

Kako ni testiranja bitov? Ne razumem... Seveda je.

Thomas ::

Kar povej mi, katera C funkcija testira bit.
Man muss immer generalisieren - Carl Jacobi

Brane2 ::

V bistvu ni elementarna.

CPU to interno vedno naredi paralelno, vsaj pisanje v RAM, pa verjetno tudi v register. Ne moreš v enem šusu vpisati samo nekaj bitov v besedi.
No, bili so VRAM-i, kjer se je to dalo in mogoče kje kak RAM to tudi danes omogoča (kak SGRAM ?) pisanje skozi masko, a načeloma tega ni.

Pri današnjih frekvencah procesorjev se kak BSET x,REGy ne razlikuje dosti od OR XYZW, REGa.

O.K. Operand je daljši, zato pa lahko setiraš poljubno kombinacijo bitov.
On the journey of life, I chose the psycho path.

Thomas ::

V Intelovem asemblerju je seveda testiranje in spreminjanje enega bita v registru podprto. C temu ne sledi. Moraš napisat par vrstic C kode, da se prevedejo v en sam assemblerski ukaz.

To se mi zdi hecno in vedno znova ne morem verjeti.
Man muss immer generalisieren - Carl Jacobi

MaCoFaCo ::

Če ni direktne funkcije, jo pač napišeš.

bool IsBitOn(int number, int position)
{
	return (number &= (1 << position)) > 0;
}

Thomas ::

Seveda napišeš funkcijo, ki se potem prevede v EN SAM assemblerski ukaz.

Sej v tem je "čudežnost" tega.
Man muss immer generalisieren - Carl Jacobi

Zgodovina sprememb…

  • spremenil: Thomas ()

Brane2 ::

Ta en sam ukaz lahko traja enako ali več kot read + or.

Največ te tu stane bralni cikel iz pomnilnika, tisti OR pa skorajda nič.

JA, tudi meni se zdi čudno, da ni bitne manipulacije, ampak ni velike izgube.


Bolj čudno se mi zdi pakiranje bitov. Ne samo pakiranje ampak nedefiniranost zaporedja "packageov".

Kot sem jaz videl, standard ne govori nič o tem, kje bo kakšen bit. To pa je neuporabno za definicijo bitov kakega I/O registra itd.
On the journey of life, I chose the psycho path.

Thomas ::

Bitne operacije so postale hitre in splačljive. Nekaj boljšega od šiftanja z oranjem.

Direktne podpore v C pa ni - in je zgleda ne bo še.
Man muss immer generalisieren - Carl Jacobi

Thomas ::

BT, bit test, ponuca 4 clock cikle pri delu v registru. Isto, kot samo za shift, kje je še drugo?

Biti in operacije z njimi so vse bolj pomembna reč, celi byte, word ... itd. pa precej "umetne tvorbe".

C tukaj - ne zaostaja - zaostal je davno!
Man muss immer generalisieren - Carl Jacobi

Brane2 ::

Zakaj rabiš shift+OR ?

Saj če bi rad postavil nek bit, je dosti OR.

Če bi rad postavil nek N bit (kjer se n lahko spreminja), lahko pač ORaš z indeksirano masko v polju.

Resda te stane, dokler mašina prvič ne pobere maske iz RAM-a, vendar tebe itak zanima hitrost velikokrat se ponavljajoče operacije.

Jasno je, da je bolje imeti ukaz za BSET kto ga ne imeti, vendar ti vsaka taka stvar jemlje prostor v bitnem prostoru ukazov.

Če bi lahko zbiral ukazni set za novi CPU, bi premislil, če in kako bi vklučil BSET.

Koneckoncev AFAIK lahko naložiš zanimive konstante v kak cacheline in ga zakleneš...
On the journey of life, I chose the psycho path.

Zgodovina sprememb…

  • spremenil: Brane2 ()

Brane2 ::


Biti in operacije z njimi so vse bolj pomembna reč, celi byte, word ... itd. pa precej "umetne tvorbe".


Vendar pomnilnik operira v chunkih od bytea itd. (ajde, tudi nibble, če iščeš).
Če pišeš enoto, manjšo od chunka, te to stane več, saj moraš vsebino spremeniti tako,d askombiniraš novo s staro.
On the journey of life, I chose the psycho path.

Thomas ::

Pišeš v RAM itak po cele bloke naenkrat. Po procesorju, po registrih, se pa bolj splača ugasniti ali prižgati en bit, kot (celo parkrat) ponovno nastaviti vseh 32 ali 64 ali več.

Novi procesorji seveda delajo s to predpostavko, C pa o tem ni slišal še nič.
Man muss immer generalisieren - Carl Jacobi

Brane2 ::

Si ziher ?

neisem se zadnje čase toliko poglabljal v to, samo to malo težko pogoltnem.

Maš kak link pri roki ?

Kot mi je znano, je tu ozko grlo /vsaj pri recimo Opteronu dekoder. Ta lahko dekodira v vsaskemciklu do tri integer ukaze iz cachelinea.

Jasno je, da je recimo OR immediate_konst, REG lahko daljši od BSET X, REG zaradi tega, ker je ukaz daljši.

Ampak to je faktor samo ob prvem zajemu ukaza. Ko je stvar v L1 cachelineu iz katerega zajema dekoder, je ta davek plačan.

Vsa naslednja izvajanja bi morala biti izvedena v 1 ciklu, če takoj za ukazom ni skokov itd.
On the journey of life, I chose the psycho path.

Brane2 ::

Je pa res, da se ti ukvarjaš s tem, meni je pa to bolj "usput".

Nisem mislu "predavat", bolj je blo mišljeno kot vprašanje. :\
On the journey of life, I chose the psycho path.

Thomas ::

Man muss immer generalisieren - Carl Jacobi

Brane2 ::


"Intel Pentium Instruction Set Reference (Basic Architecture Overview)"


Si ziher, da to velja tudi za tvoj P4 ?

Sem poiskal okrog, a na prvi uč ni videt, o katerem Pentiumu govorijo te kartice ukazov.

Če bi moral ugibat, bi ugibal, da za prvo generacijo.

Če si mi dal to kot link, ki je pri roki, O.K.

Če pa delaš po tem, bi IMHO bilo bolj primerno delat direkt po papirjih proizvajalca.
On the journey of life, I chose the psycho path.

Zgodovina sprememb…

  • spremenil: Brane2 ()

Thomas ::

Man muss immer generalisieren - Carl Jacobi

snow ::

Še eni tajmingi.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Gundolf ::

Sem se spomnu ja, da ker tako neumno dela tale dvojni ampersant, ga nismo vključili v Critticall.
Čaki mal, kaj neumno dela? Pač logični operator v nasprotju z bitnim &. Drugo je kaj C vzame za logično, boolovo vrednost, ker nima posebnega tipa za te stvari.

Thomas ::

Zame je 1 AND 4 = 1 butasto.

Nimam nobenega spoštovanja do te sorte geekovstva, sorry.
Man muss immer generalisieren - Carl Jacobi

OwcA ::

Dvomim, da obstaja kakšen višjenivojski jezik, ki ima logični in definiran drugače.
Otroška radovednost - gonilo napredka.

Thomas ::

Jah ... samo en ampersant je čist OK. Dvojnega ("logičnega") se pa velja izogibat.

A nej bom še eksplicitnejši?

00000100 AND 00000001 = 00000001 ???

ali

00000100 AND 00000010 = 00000001 ???

Da se kr en (nulti) bit postavi na 1, drugi pa vsi na nulo???


Če že, zakaj ne vsaj

00000100 AND 00000010 = 11111111
Man muss immer generalisieren - Carl Jacobi

Brane2 ::

IMHO zato, ker dvojni and sploh ni namenjen temu, za kar ga skušaš uporabit.

Je le za clever bližnice,da ti ni treba pisat if else if else if else if ...
On the journey of life, I chose the psycho path.

Zgodovina sprememb…

  • spremenil: Brane2 ()

OwcA ::

@Thomas: to je precej izkrivljen pogled, ker ne upoštevaš tipov in specializacije. Če obstaja and definiran za dan par tipov (tega ne podpirajo vsi jeziki), se uporabi ta, drugače najprej oba operanda pratvorimo (odvisno od strogosti jezika, ponekod je to implicitno) v tip bool in šele potem računamo z njima.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

Gundolf ::

bitwise: 1 & 4 = 0
logično: 1 && 4 = 1
Ima pa to drugo bol mal veze s samim operatorjem in več s pojmovanjem logičnih vrednosti v C-ju. Operator hoče imet logične vredosti na vhodu in vrne logično vrednost na izhodu. 1 ni logična vrednost in se prevede v nek 'true', ki je definiran le v kompajlerju, isto velja za 4. Rezultat je isto kompajlerski 'true' (pri tem da operator izpusti izračun druge vrednosti kadar je rezultat znan že po prvi). Ko ga pa ti sraviš v nek C tip, recimo int, pa rata 1. Čudno? Neumno? Simple kot pasulj.

Pri C++ je malo drugače, ker dejansko imaš bool tip, vendar je operator zaradi kompatibilnosti podedoval C pretvorbo int vrednosti v bool.

Thomas, operato&& ne le da ni neumen, tudi zelo uporaben je. Ne vem kaj ti delaš brez njega ampak očitno se mučiš z & za brezveze. Čisto druga vrsta geekovstva. Če je pa bolj spoštovanja vredna...

Se pa strinjam s tabo do neke mere (se mi zdi da razmišljaš v tej smeri), in mi je recimo veliko bolj všeč, če je napisano if (a > 0), kot if (a)

Fury ::

Gundolf sam to ni isto.. ker je pri if(a) lahko a negativen pa passa test pri if(a>0) pa ne :) Bolj primerno bi blo rect da preferiras if( a!=0 ).. seveda to dela samo za inte pravilno... floati so pa ze epsilon heaven :)

Thomas ::

Zakaj OR vseh bitov ravno v 0-ti bit, kadar se sprašujemo, če je nek integer (ali kakšen drug tip) true?

Ta dogovor, potegne za seboj nesimetričnost bitnega stringa.

Tile se tud sekirajo zaradi tega.

In to rešujejo na svojski način. +0 in -0.

Tretji spe raje rečejo, da true je -1. Ki ima vse bite na 1 in ni nesimetrije.
Man muss immer generalisieren - Carl Jacobi

Gundolf ::

fury, kdo pravi da je a int?

Thomas, zakaj te sploh briga ali je tvoj bool 111..11 1li 000..01? Kaj ti pomaga simetrija pri bool spremenljivki, ki (če je ne zlorabiš) ima itak le dve vrednosti? To da so se, ko so načrtovali C, odločili proti uporabi dedicated bool tipa, je po moje slabo. To da so se odločili zakodirat bool v int tako, da je 0 false in vse ostalo true je pa še najboljša možna alternativa.

Thomas ::

> To da so se, ko so načrtovali C, odločili proti uporabi dedicated bool tipa, je po moje slabo.

Absolutno slabo.

> To da so se odločili zakodirat bool v int tako, da je 0 false in vse ostalo true je pa še najboljša možna alternativa.

Boljš bi blo - v sicer že zamočeni situaciji - da ima true vse bite postavljene na 1. False pa vse na 0(, kot aktualno ima).

"Vmes" pa nič, ker sta samo dve različni vrednosti booleana. "3 && 5" je nesmisel.
Man muss immer generalisieren - Carl Jacobi

Thomas ::

Bilo bi pa logično tudi nekaj drugega.

Če v C rečemo if (a=1) .... potem nam kar priredi a-ju 1. Zato moramo reči if (a==1), da je ta if nedestruktiven za a.

Zakaj ne bi potem s to logiko šli tudi iz & na &&?

Ker zdajšnja uporaba && je očitno precej neumna in odveč.
Man muss immer generalisieren - Carl Jacobi

Fury ::

Gundlof, hotel sem rect da vsi te ifi (tut tvoji) odpovejo pri floatih.. je pa definitivno boljs x!=0 kot x>0 ce zamenjujes if(x)

Gundolf ::

Fury, sej se strinjava, meni so pogoji, kjer je podana le spremenljivka tipa ne-bool grdi. Čeprav ne vem, če res odpove, če mu notri daš float. Še nisem probal ampak po moje isto dela.

Thomas, kaj je prednost, da imaš samo dve (00..0 in 11..1) legalni opciji za true / false kodiranje v spremenljivkah tipa int? Jaz je ne vidim.

Se pravi ti nikoli ne uporabljaš '&&'? Te tudi to ne gane, da '&' za razliko od '&&' vedno izračuna oba operanda?

Aja, kaj je tvoja nova ideja, da postane '&' kar ekvivalenten '&=' ?

OwcA ::

Čeprav ne vem, če res odpove, če mu notri daš float.

Odpove lahko, če imaš numerično nestabilen problem in si blizu 0.
Otroška radovednost - gonilo napredka.

Gundolf ::

Kako odpove? Da reče da je enako 0, čeprav je v resnici le zel zelo majhna cifra? Po moje da ne, ker (spet po moje) ne dela float primerjave z 0.0f ampak enostavo pogleda če so vsi biti v številu enaki 0.

Thomas ::

> Aja, kaj je tvoja nova ideja, da postane '&' kar ekvivalenten '&=' ?

Ne. Moja "nova ideja" je ta, da "strict C", ki ga pozna Critticall je dovolj. Vse je prevedljivo vanj.

Sej nič hudega, če se noben ne strinja, to je moje stališče, ki pa ga nisem niti pripravljen braniti, ker nekaterih reči nisem pripravljen razlagati

Ampak če že vprašaš.
Man muss immer generalisieren - Carl Jacobi
«
1
2 3


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

križci krožci c # (strani: 1 2 )

Oddelek: Programiranje
5010670 (9329) Yacked2
»

[Java] While zanka

Oddelek: Programiranje
262169 (1752) kunigunda
»

Nemorem rešit ene naloge z c++ (sem začetnik) (strani: 1 2 )

Oddelek: Programiranje
689955 (5693) technolog
»

[c] Enaki datoteki

Oddelek: Programiranje
7915 (775) Spura
»

[C#] overloaded operator ==

Oddelek: Programiranje
91045 (924) user4683

Več podobnih tem