logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Różnice między operatorami |= i &= w programowaniu C na uC

demeus 22 Kwi 2008 01:12 1980 15
REKLAMA
  • #1 5063211
    demeus
    Poziom 18  
    Posty: 409
    Pomógł: 10
    Ocena: 61
    Witam
    Jestem w trakcie przerabiania kursu programowania C na uC...

    I nie za bardzo rozumiem ideę różnicy pomiędzy operatorami
    "|=" oraz "&="

    Czy ktoś mi może łopatologicznie wyjaśnić czym się różnią te dwa operatory i gdzie/w jaki sposób się je stosuje.

    z góry dziękuję

    --
    pozdrawiam demeo
  • REKLAMA
  • #2 5063218
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Tak, jeden |= to operator logicznego dodawania (OR)
    a drugi &= mnożenia (AND)

    a=a|0x0f <==> a|=0x0f
    (tu na 4 młodszych bitach będą 1)

    a=a&0x0f <==> a&=0x0f
    (a tu na 4 starszych bitach będą zera):)

    Dodano po 1 [minuty]:

    Ogólnie operator
    "operator=" można stosować z każdym z operatorów arytmetycznych i logicznych:)
    * : - / % | & && ||...
  • REKLAMA
  • #4 5063574
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 42
    Balu napisał:
    Tak, jeden |= to operator logicznego dodawania (OR)
    a drugi &= mnożenia (AND)


    Logicznego ? A ja zawsze myslalem ze bitowego ;-).
  • #5 5063727
    rusala
    Poziom 22  
    Posty: 475
    Pomógł: 44
    Ocena: 6
    logika opiera sie dwoch stwierdzeniach - prawda i falsz tak jak i bity 0 i 1 wiec co za roznica :-)
  • #6 5063754
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    fantom ma oczywiscie racje.

    BF
  • #7 5064470
    KowalD
    Poziom 17  
    Posty: 290
    Pomógł: 13
    Ocena: 3
    rusala napisał:
    logika opiera sie dwoch stwierdzeniach - prawda i falsz tak jak i bity 0 i 1 wiec co za roznica :-)

    jest roznica miedzy operatorami &, a &&... oraz |, a || :)... te pojedyncze (bitowe) porownuja poszczegolne bity... a podwojne (logiczne) cale liczby :)... no przynajmniej ja jestem o tym przekonany ;)...
  • #8 5064540
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 42
    KowalD napisał:

    te pojedyncze (bitowe) porownuja poszczegolne bity... a podwojne (logiczne) cale liczby :)... no przynajmniej ja jestem o tym przekonany ;)...


    Te operatory niczego nie porównują, ani jedne ani drugie.
  • REKLAMA
  • #9 5065935
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Przykład na "|="

    A = 01010101;
    B = 00001111;
    A |= B;
    //A=01011111;

    Przykład na "&="

    A = 01010101;
    B = 00001111;
    A &= B;
    //A=00000101

    Może to coś wyjaśni ?
  • #10 5065989
    KowalD
    Poziom 17  
    Posty: 290
    Pomógł: 13
    Ocena: 3
    fantom napisał:

    Te operatory niczego nie porównują, ani jedne ani drugie.

    to juz jest czepianie sie slowek i... nie rozumienie skrotow myslowych ;)... ale moze rzeczywiscie powinienem napisac, ze... "dzialaja na" (czy cos w tym stylu) zamiast "porownuja" :D...
  • #11 5066867
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    fantom napisał:
    Balu napisał:
    Tak, jeden |= to operator logicznego dodawania (OR)
    a drugi &= mnożenia (AND)


    Logicznego ? A ja zawsze myslalem ze bitowego ;-).


    Zwał jak zwał:> Dla mnie to logiczne:>

    bigfoot napisał:
    fantom ma oczywiscie racje.

    Ja się zgadzam ale w/g mnie te dwa wyrażenia są używane zamiennie:>
    Czy to logiczne czy bitowe...
    Chyba, że atmel kłamie;>
    (8051 wszystkie instrukcje logiczne (BITOWE) są z sufixem "L" - ANL / ORL i jest to AND Logical i OR Logical... Więc logiczne;) )
  • #12 5067288
    rusala
    Poziom 22  
    Posty: 475
    Pomógł: 44
    Ocena: 6
    no ja tez bym tak twierdzil, w koncu jakies "slangowe" okreslenia sa w tej branzy dopuszczalne prawda :-) W kazdym razie w istocie podwojne operatory jak && sluza do zgola innych celow. Moze poprostu wytlumaczmy to konkretnie. Operator &= naklada na dana liczbe (tudziez wyrazenie itp) tak zwana maske. Owa maska wynoszaca np 0x55 bitowo wyglada tak: 01010101. Ponalozeniu takiej maski na liczbe wszystkie bity skorelowane z zerami w masce zostana wyzerowane czyli np nakladajac 01010101 na 00001111 otrzymamy 00000101 czyli wykonalismy wlasnie iloczyn logiczny. Bity skorelowane z jedynkami z maski zostaly przepisane bez zmian.

    Natomiast w wypadku operatora |= jest "odwrotnie" - wplywamy teraz na zera a nie na jedynki dorzucajac jakby jedynki w miejscach wskazanych przez wyrazenie z ktorym orujemy. Na przyklad mamy ponownie liczbe 0x55 czyli 01010101 i teraz orujemy ja z 00001111 w wyniku takiej operazji na wszystkich miejscach skorelowanych z jedynkami zostana ustawione jedynki a z zerami zostana przepisane bez zmian zatem otrzymamy 01011111 i to powinno juz wszystko wyjasnic.
  • REKLAMA
  • #15 5067308
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    A do linka, który podałem, to pewnie nikt nawet nie zajrzał...
    Bo i po co, jak można to odkryć na nowo:)
  • #16 5067309
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    podales linka do spisu tresci [; reszte juz sobie wyjasnij sam <:

    swoja droga to udalo mi sie zassac ostatnio z netu ksiazke 'Jezyk ANSI C' zwana tez 'Biblia' [; anyone? <:

    0x41 0x56 0x45!!

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji wyjaśniono różnicę między operatorami bitowymi przypisania w języku C stosowanymi na mikrokontrolerach: "|=" oraz "&=". Operator "|=" wykonuje bitową operację OR z przypisaniem, co oznacza, że na bitach odpowiadających jedynkom w masce ustawiane są jedynki w zmiennej docelowej. Przykładowo, dla A=01010101 i B=00001111, A |= B skutkuje A=01011111. Operator "&=" wykonuje bitową operację AND z przypisaniem, czyli maskuje zmienną, zerując bity odpowiadające zerom w masce. Dla tych samych wartości A i B, A &= B daje A=00000101. Podkreślono, że operatory te działają na poziomie bitów, a nie na poziomie logicznym (prawda/fałsz), co odróżnia je od operatorów logicznych "&&" i "||". Operator "=" można łączyć z różnymi operatorami arytmetycznymi i bitowymi, tworząc skrócone formy przypisania. Wskazano także na różnice między operatorami bitowymi pojedynczymi (&, |) a logicznymi podwójnymi (&&, ||). Dyskusja zawierała przykłady binarne ilustrujące działanie operatorów oraz odniesienia do terminologii stosowanej w mikrokontrolerach, np. w rodzinie 8051, gdzie instrukcje logiczne bitowe mają sufiks "L" (ANL, ORL).
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA