Bitove operatory [C]

Programovacie jazyky, rady, poradňa...
Tiestik
Amateur
Amateur
Príspevky: 24
Registrovaný: 26 apr 2014, 18:49

Bitove operatory [C]

Príspevok od používateľa Tiestik »

Caute prosim vas mozte mi niekto vysvetlit ako sa rataju bitove operatory & | ^

napr.

Kód: Vybrať všetko

13 & 6 =
13 | 6 =
13 ^ 6 = 
dakujem
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Bitove operatory [C]

Príspevok od používateľa harrison314 »

1, prevdeis do dvojkovej sustavy
13= 1101 , 6 = 110
2, zarovnas
13 = 1101, 6 = 0110
3, pouzijes operator
& -and, | -or, ^ - exckuziv or
napr
1101 & 0110 = 0100
1101 | 0110 = 1111
1101^ 0110 = 1010
Tiestik
Amateur
Amateur
Príspevky: 24
Registrovaný: 26 apr 2014, 18:49

Re: Bitove operatory [C]

Príspevok od používateľa Tiestik »

diky moc a nahodou v tom poslednom XOR 1101^ 0110 = nema to byt vysledok toto = 1011 ?
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Bitove operatory [C]

Príspevok od používateľa harrison314 »

ano mala,
a este tie cisla treba previest naspet do desiatkovej sustavy, aby si videl vysledky
Tiestik
Amateur
Amateur
Príspevky: 24
Registrovaný: 26 apr 2014, 18:49

Re: Bitove operatory [C]

Príspevok od používateľa Tiestik »

jop to viem uz :)

//autoeditácia príspevku (31 Máj 2014, 16:53)
Mozes mi pomoct este s jednym prikladom ze co vypise tento program nizsie ? skusal som to uz viacej krat ale neviem je spravne ze c je 0 ?

Kód: Vybrať všetko

int main()
{
unsigned a=5, b=4, c=0;

while (b != 0) {
    if ((b & 1) != 0)
        c = c + a;
    a = a << 1;
    b = b >> 1;
}
printf("%u\n", c);
return 0;
}
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Bitove operatory [C]

Príspevok od používateľa pcsiete »

Ak sa na to dobre pozerám, tak by to malo vypísať 20. Vyzerá to ako simulácia násobenia.
Tiestik
Amateur
Amateur
Príspevky: 24
Registrovaný: 26 apr 2014, 18:49

Re: Bitove operatory [C]

Príspevok od používateľa Tiestik »

20 by to bolo keby tam bolo v podmienke == 0, nie ?

lebo tam v podmienke ze (b,cize 4 & 1) != 0, ked to vyratam tak vznikne 0 != 0 tym padom sa preskoci podmienka a v c sa nic nezmeni ?
a vypise sa 0 ?

hovorim to spravne :-D ?
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Bitove operatory [C]

Príspevok od používateľa pcsiete »

nie. Pokým b > 0, ak je n-tý bit b nastavený, prirátaj a<<n.

Je tu úplne rovnaké ako v 10tkovej sústave:

Kód: Vybrať všetko

a = 7435;
b = 8321;
c = a*b;

1. c = 7435*1;
2. c += 7435*2 * 10;
3. c += 7435*3 * 100;
4. c += 7435*8 * 1000;

Kód: Vybrať všetko

a = 21; //0b10111
b = 5;  //0b0101
c = a*b;

1. c = 0b1 * 0b10111;
2. c += 0b0 * 0b10111 * 2;
3. c += 0b1 * 0b10111 * 4;
2. c += 0b0 * 0b10111 * 8;
Čiže povedzme že máme čísla a a n, medzivýsledok kroku je c, poradie cifry je n a sústava je x. Potom je jeden krok:

Kód: Vybrať všetko

c = a * b[n] * x^n
V dvojkovej sústave v C-čku je to

Kód: Vybrať všetko

c = a * ((b >> n) & 1) * 1<<n
Tiestik
Amateur
Amateur
Príspevky: 24
Registrovaný: 26 apr 2014, 18:49

Re: Bitove operatory [C]

Príspevok od používateľa Tiestik »

Caute prosim vas moyte mi pomoct z jednym prikladom uz ho nevladzem ratat ;D ,tak keby ste mi niekto mohli povedat ze ktora odpoved je spravna a povedat aj preco :) diky

je definovane makro: #define CISLO(i) (1<<(i))
Ako vynulujeme prve 3 bity v cisle ulozenom v premennej x, pricom sa ostatne bity nezmenia?

Kód: Vybrať všetko

a) x &= ~ ( (~CISLO(1)) & (~CISLO(2)) & ~1);
b) x &= ~ (CISLO(1) | CISLO(2) | 1);
c) x |= ((~CISLO(0)) & (~CISLO(1)) & (~CISLO(2)) );
d) x &= ~( CISLO(0) | CISLO(1) | CISLO(2));
e) ziadna z odpovedi nie je spravna
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Bitove operatory [C]

Príspevok od používateľa pcsiete »

b) a d) vyzerajú byť rovnaké, ale možno som niečo prehliadol.

Makro CISLO(i) nahradzuje 2^i, teda...

Kód: Vybrať všetko

//a)
x &= ~ ((~CISLO(1)) & (~CISLO(2)) & ~1);
x &= ~(~2 & ~4 & ~1);
x &= ~(-3 & -5 & -2);
x &= ~(-8);
x &= 7;

//b - vyzerá správne
x &= ~(CISLO(1) | CISLO(2) | 1);
x &= ~(2 | 4 | 1);
x &= ~7;
x &= -8;

//c
x |= ((~CISLO(0)) & (~CISLO(1)) & (~CISLO(2)) );
x |= (-1 & -2 & -4);
x |= -8;

//d - tiež vyzerá správne
x &= ~(CISLO(0) | CISLO(1) | CISLO(2));
x &= ~(1 | 2 | 4);
x &= ~7;
x &= -8;
Napísať odpoveď