Problem z operacjami bitowymi

0

Witam,
Mam następujący problem z językiem C++.

Mam bajt: char a = 5;
Jako liczba dwójkowa to 101.

1 Problem:
Chcę napisać funkcję która wykona xor dla konkretnego bajtu, na przykład:

bool xor_bitowy(char a)
{
}

Następnie funkcję xor_bitowy chcę użyć do operacji XOR na całej tablicy bajtów (prosta pętla).

2 Problem:
Chcę wyświelić liczbę np. 8 bitową typu char korzystając z operacji bitowych (od tyłu i od przodu). Myślałem aby użyć do tego celu operacji przesunięć.

Zaczynam od wyświetlenia od tyłu (bo wydaje się prostsze).

// wyswietla liczbe binarnie od tylu
#include <iostream>

using namespace std;

int main()
{
    char a = 5;

    for(int i = 1; i <= a; i << 1) {
        if(i & 1)
            cout << 1;
        else
            cout << 0;
    }
    cout << endl;
    return 0;
}

W pierwszym przebiegu spodziewam sie, ze i:
00000001
W kolejnych..
00000010
00000100.

Zrobiłem to na kartce i jakby wcale nie przesuwał tych bitów.

3 Problem:
a może można odwrócić szybko kolejność bitów i nie trzeba robić przesunięcia w prawo?

0

no bo nie przesuwa

i << 1 nic nie robi
znaczy liczy przesunięcie ale nigdzie tego nie zapisuje, powinieneś napisać i = i << 1 albo i <<= 1
i nie powinieneś sprawdzać i & 1 tylko a & i

poza tym warto najpierw zapytać - wiesz oczywiście że istnieje gotowy operator do xorowania - ^?

0

Dzięki, trochę mi głupio bo mogłem sam na to wpaść.

Co do XORowania, wiem że są dwa operatory:
^ - bitowe xor wykonywane tylko na konkretnym bicie (potrzebuje konkretnej maski)
^= operator wykonywany na liczbie

Generalnie moim celem jest wyznaczenie XOR dla tablicy bajtów. Czy jak wykorzystam prostszy operator operujący na liczbie czy coś utracę?

0

^ i ^= różnią się tym samym, co << i <<=.

0
lipaa napisał(a):

Co do XORowania, wiem że są dwa operatory:
^ - bitowe xor wykonywane tylko na konkretnym bicie (potrzebuje konkretnej maski)
^= operator wykonywany na liczbie

Nie rozumiem, po co to rozróżnienie. Przecież maska jest liczbą. Na przykład (dla liczb 8-bitowych):

maska 1 << 5 --> 00100000
maska 1 --> 00000001

Więc dlaczego niby ^ działa tylko na jednym bicie? Maską może być nawet 11111111, co odwróci wszystkie bity w bajcie:

x = 0xF0 ^ 0xFF; /* x == 0x0F */

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