Problem z operatorem ~

0

Nie wiem czy spotkaliście się z takim czymś:

Jeśłi mi dobrze wiadomo to operator ~ jest operatorem bitowym. Powinien więc zmieniać bity w zmiennej na przeciwne. Mając zmienną

int a = 32;

powinno być:
1 0 0 0 0 0

~a
0 1 1 1 1 1
no chba że coś mi się pomerdało...
Z nie wiadomych mi przyczyn operator ~ działa jak jednoargumentowy -. Czy to normalne, czy tylko ja tworzę jakieś problemy ?

0

dokładniej to
~a = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1

DzieX napisał(a)

Z nie wiadomych mi przyczyn operator ~ działa jak jednoargumentowy -. Czy to normalne, czy tylko ja tworzę jakieś problemy ?
a masz jakiś pomysł na drugi argument ?!??

0

Nie chodziło mi o to że powinian być dwuargumentowy, tylko że zmienia wartość (dziesiętną) zmiennej na przeciwną:

a = 32;
a = ~a;
cout << a;

-32;

Czy możesz napisać które bity odpowiadają za znak liczby ?

0

Faktycznie, przepraszam za pomyłkę... [wstyd]

0

Dobra, może spróbuję inaczej:
mam
unsigned int flag = 000010;
oraz
unsigned int config = 100001;

i teraz chce żeby flaga była wstawiona do ustawień (config). Wszystko jest dobrze, używam operatora |= i gotowe.

Ale chciałbym zrobić tak, że jeśli znów wyślę do obiektu (bo wysyłam przeładowanym operatorem >>) flagę to jeśli jest już aktywna, zostaje wyłączona.
Czyli jeśli config ma wartość 100011, to żeby znów było 100001...

Po 2 dniach (!) zmagań nie udało mi się tego napisać. Czy moglibyście pomóc ?

0

na moje oko:

config &= (~flaga) 

Nie sprawdzalem czy dziala.

0
DzieX napisał(a)

Jeśłi mi dobrze wiadomo to operator ~ jest operatorem bitowym. Powinien więc zmieniać bity w zmiennej na przeciwne. Mając zmienną

int a = 32;

powinno być:
1 0 0 0 0 0

~a
0 1 1 1 1 1
no chba że coś mi się pomerdało...
pomerało Ci się
~ to nie NOT ale NEG - negacja a nie inwersja
czyli inwersja plus jeden

NEG a -> NOT a, INC a

Poczytaj o zapisie liczb ujemnych w notacji uzupełnienia do dwóch.

[<font color="blue">do postu poniżej</span>]
No inwersję można machnąć jako:
a ^= -1;

0

Thx, najprostsze rozwiązania są najlepsze [wstyd].

Pozostaje jeszcze kwestia sprawdzenia czy flaga juz jest aktywan czy jeszcze nie, i wywołanie odpowiedniaj instrukcji...

[Dodane]
W moim przypadku lepiej było użyć operatorea ^= (to tak dla tych którzy czytaliby to później).

1 użytkowników online, w tym zalogowanych: 0, gości: 1