Cześć! To mój pierwszy post na forum, więc witam wszystkich i proszę o podpowiedź...
Chcę stworzyć większy projekt w C++ i do tej pory jakoś mi szło, a jak już trafiłem na większy problem to w większości przypadków Google pomagało, aż tego problemu który mam teraz...
Wiem, że to dość dziwnie wygląda, "robi duży projekt a nawet przesunięć bitowych nie umie zrobić" ale totalnie nie mam pomysłu czemu tak mi się sypią dane.
Założenia:
Mam cztery zmienne typu char które mają się złożyć na większą zmienną typu unsigned int.
Problem:
Przesunięcia bitowe nie dzałają tak, jakbym się tego spodziewał, to znaczy psują mi całą wartość zmiennej wypełniając ją jedynkami.
int main()
{
char a = 0b11110001;
char b = 0b11100011;
char c = 0b11000111;
char d = 0b10001111;
unsigned all = 0;
print_bits(bin_, &a); //ta funkcja wyświetla zmenną w postaci bitowej
print_bits(bin_, &b);
print_bits(bin_, &c);
print_bits(bin_, &d); //tekst w konsoli:
//11110001111000111100011110001111
cout << endl;
all |= ( (a << 24) | (b << 16) | (c << 8) | d );
print_bits(bin_, &all);
cout << endl;
}
W teorii powinienem dostać dwie takie same linijki
11110001111000111100011110001111
11110001111000111100011110001111
Gdzie pierwsza to wyświetlone po kolei zmienne (a, b, c, d) a druga to zmienna pomocnicza (all) zawierająca wynik operacji OR na tych zmiennych.
Jednak dostaję coś zupełnie innego...
11110001111000111100011110001111
11111111111111111111111110001111
Zmieniłem trochę wartości tych zmiennych na takie...
char a = 0b01110001;
char b = 0b01100011;
char c = 0b01000111;
char d = 0b00001111;
Zmieniłem tylko wartość MSB na 0, a jak się okazało, to wystarczyło by otrzymać dwa takie same wyniki w konsoli.
01110001011000110100011100001111
01110001011000110100011100001111
Ktoś wie czemu to tak działa ? Przecież to tylko przesunięcie każdej ze zmiennych typu char na swoje miejsce w zmiennej typu unsigned int.
Kod funkcji print_bits
print_bits(enum_mode _mode, T_data *_data)
{
if(_mode == bin_)
{
for(int i = ( (7 * sizeof(*_data)) + (sizeof(*_data) - 1); i >= 0; i--)
{
cout << (0 + ((*_data >> i) & 1));
}
}
}