Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dzielenie char na pojedyńcze bity

Ostatnio zmodyfikowano 2014-10-25 18:48
Autor Wiadomość
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.
P-119322
1aam2am1
» 2014-10-24 20:54:03
Jeżeli chodzi ci o wydobycie jednego bitu informacji na danym miejscu to masz to:
C/C++
char zmienna;
std::cout <<( zmienna & 1 << 0 ); //miejsce nr 1
std::cout <<( zmienna & 1 << 1 ); //miejsce nr 2
itd...
P-119327
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ą.
P-119331
1aam2am1
» 2014-10-24 21:46:23
Może pole bitowe?
P-119334
stryku
» 2014-10-25 01:46:48
Zmodziłem taką strukturę. O coś takiego chodziło?
C/C++
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:
C/C++
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;
}
P-119347
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?
P-119352
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:

C/C++
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?
C/C++
struct byte
{
    unsigned char bit[ 8 ]: 1;
};

Czy nie ma innego sposobu niż tak jak podałem wyżej?
P-119359
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.
P-119367
« 1 » 2
  Strona 1 z 2 Następna strona