Dzielenie char na pojedyńcze bity
Ostatnio zmodyfikowano 2014-10-25 18:48
stevy Temat założony przez niniejszego użytkownika |
Dzielenie char na pojedyńcze bity » 2014-10-24 20:26:52 Witam, szukam sposobu, żeby zamienić znak char na bity, które mógłbym obsługiwać. Potrzebuję tego do zadania z szyfrowaniem S-DES. Czytałem, że można to zrobić unią, ale poszukiwania sposobu zakończyły się fiaskiem. |
|
1aam2am1 |
» 2014-10-24 20:54:03 Jeżeli chodzi ci o wydobycie jednego bitu informacji na danym miejscu to masz to: char zmienna; std::cout <<( zmienna & 1 << 0 ); std::cout <<( zmienna & 1 << 1 );
itd... |
|
stevy Temat założony przez niniejszego użytkownika |
» 2014-10-24 21:11:07 chodzi bardziej, żebym mógł zapisać te wartości do tablicy, zmiennych, lub zrobić do nich wskaźniki, bo jednym z etapów szyfru jest permutacja tych wartości. Dlatego preferowałbym rozwiązanie z unią. |
|
1aam2am1 |
» 2014-10-24 21:46:23 Może pole bitowe? |
|
stryku |
» 2014-10-25 01:46:48 Zmodziłem taką strukturę. O coś takiego chodziło? struct byte { unsigned char bit[ 8 ]; byte() { } byte( char c ) { * this = c; } char operator []( int i ) const { if( i < 8 && i >= 0 ) return bit[ i ]; else return - 1; } void operator =( char c ) { for( int i = 0; i < 8; i++ ) bit[ i ] =( c >>( 7 - i ) ) % 2; } }; sposób użycia: int main() { byte b[ 8 ]; for( int i = 0; i < 8; i++ ) b[ i ] = i; for( int i = 0; i < 8; i++ ) { std::cout << i << " = "; for( int j = 0; j < 8; j++ ) std::cout << static_cast < int >( b[ i ][ j ] ); std::cout << "\n"; } return 0; } |
|
stevy Temat założony przez niniejszego użytkownika |
» 2014-10-25 09:18:45 No o coś takiego w miarę chodziło, po wrzuceniu do tablicy zamiast na wyjście już mogę robić permutację, wielkie dzięki. Co do pola bitowego, to czytałem trochę o nim, próbowałem, ale nie udało mi się znaleźć rozwiązania. Mógłbyś przedstawić jak podzielić char na bity dzięki niemu? |
|
stryku |
» 2014-10-25 12:22:37 Jeżeli bardzo Ci zależy na pamięci to pole bitowe będzie lepsze, ale trochę to komplikuje sprawę. Dzięki temu przy reprezentowaniu jednego bajta zamiast 8 bajtów będziesz zużywał tylko jeden. Będzie to wyglądało mniej więcej tak: struct byte { unsigned char bit0: 1; unsigned char bit1: 1; unsigned char bit2: 1; unsigned char bit3: 1; unsigned char bit4: 1; unsigned char bit5: 1; unsigned char bit6: 1; unsigned char bit7: 1; byte() { } byte( unsigned char c ) { * this = c; } unsigned char operator []( int i ) const { switch( i ) { case 0: return bit0; break; case 1: return bit1; break; case 2: return bit2; break; case 3: return bit3; break; case 4: return bit4; break; case 5: return bit5; break; case 6: return bit6; break; case 7: return bit7; break; default: return - 1; } } void operator =( unsigned char c ) { bit0 =( c >> 7 ) % 2; bit1 =( c >> 6 ) % 2; bit2 =( c >> 5 ) % 2; bit3 =( c >> 4 ) % 2; bit4 =( c >> 3 ) % 2; bit5 =( c >> 2 ) % 2; bit6 =( c >> 1 ) % 2; bit7 = c % 2; } };
I mam pytanie do mądrzejszych ode mnie :) Czy da radę zrobić mniej więcej coś takiego? struct byte { unsigned char bit[ 8 ]: 1; };
Czy nie ma innego sposobu niż tak jak podałem wyżej? |
|
1aam2am1 |
» 2014-10-25 13:58:59 styku w polach bitowych nie określamy rodzaju zmiennej powinno być tak unsigned bit1 :1; //unsigned ponieważ jest to liczba dodatnia tylko bez znaku char definiuje już wielkość zmiennej a my tego nie chcemy
Z tego co mi wiadomo niemożna utworzyć takich tablic. |
|
« 1 » 2 |