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

XOR - kiedy ciągi bitów są różnej długości.

Ostatnio zmodyfikowano 2017-10-30 22:45
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
XOR - kiedy ciągi bitów są różnej długości.
» 2017-10-28 02:09:33
Witam. Rozumiem, na czym polega xor, i rozumiem przykład z tej strony, ale mam kilka pytań:

- co jeśli w ciąg a będzie dłuższy od b?

a = 10010
b = 10

Jak wtedy to będzie wyglądało? coś tego typu?

10010
00010
-----
10000


i odwrotnie, czyli ciąg b jest dłuższy od a:

a = 10
b = 10110

00010
10110
-----
10100

?

I ostatnie, czy mając taką sytuację
char x = 'a' ^ 'b';
'a' jest zamieniane na liczbę 97, a liczba 97 zapisywana dwójkowo: 110 0001
'b' jest zamieniane na liczbę 98, a liczba 98 zapisywana dwójkowo: 110 0010

    1100001
    1100010
    -------
x = 0000011
x = 3 (decymalny)
i konwersja liczby 3 na char


Czy dobrze rozumiem? Jeśli nie, to jak to wygląda? Powinienem coś jeszcze wiedzieć?

P-166132
jankowalski25
» 2017-10-28 02:31:29
Przecież jeśli zmienne są tego samego typu, to zajmują tyle samo bitów. Poza tym, podstawową jednostką jest bajt, więc obie zmienne będą zajmowały zawsze co najmniej osiem bitów.
P-166133
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-10-28 03:18:13
Mialem tu na mysli sytuacje long long, int albo short, int
P-166134
jankowalski25
» 2017-10-28 03:20:55
Wtedy nastąpi niejawne rzutowanie do odpowiedniego typu (
short
 na
int
,
int
 na
long long
, i tak dalej).

Dopisano:
A jeśli szukasz ciekawszych przypadków, to możesz poeksperymentować z klasami, na przykład tak:
C/C++
#include <iostream>
#include <string>
#include <typeinfo>

#define PRINT_TYPE(variable) print_type(typeid(variable),#variable)
#define CHECK_AND_PRINT(value) if(type==typeid(value)) std::cout<<#value

template < typename T >
class C_Type
{
    T value;
public:
    C_Type( T value );
    T operator ^( T t );
    operator short();
    operator int();
    operator long long();
};

void print_type( const std::type_info & type )
{
    std::cout << '(';
    CHECK_AND_PRINT( short );
    else CHECK_AND_PRINT( int );
    else CHECK_AND_PRINT( long long );
    else CHECK_AND_PRINT( C_Type < short > );
    else CHECK_AND_PRINT( C_Type < int > );
    else CHECK_AND_PRINT( C_Type < long long > );
    else std::cout << "unknown";
   
    std::cout << ')';
}

void print_type( const std::type_info & type, const std::string & name )
{
    std::cout << name << ": ";
    print_type( type );
    std::cout << '\n';
}

template < typename T >
C_Type < T >::C_Type( T value )
    : value( value )
{
    print_type( typeid( value ) );
    std::cout << value << '\n';
}

template < typename T >
T C_Type < T >::operator ^( T t )
{
    std::cout << "xor(";
    print_type( typeid( value ) );
    std::cout << value << ',';
    print_type( typeid( t ) );
    std::cout << t << ")\n";
    return value ^ t;
}

template < typename T >
C_Type < T >::operator short()
{
    std::cout << "operator short(" << value << ")\n";
    return static_cast < short >( value );
}

template < typename T >
C_Type < T >::operator int()
{
    std::cout << "operator int(" << value << ")\n";
    return static_cast < int >( value );
}

template < typename T >
C_Type < T >::operator long long()
{
    std::cout << "operator long long(" << value << ")\n";
    return static_cast < long long >( value );
}

int main()
{
    C_Type < short > c_short( 164 );
    C_Type < int > c_int( 490214 );
    C_Type < long long > c_long_long( 82394823236712 );
    auto c_first = c_short ^ c_int;
    auto c_second = c_int ^ c_long_long;
    C_Type < short > c_first_short = c_short ^ c_int;
    C_Type < int > c_first_int = c_short ^ c_int;
    C_Type < int > c_second_int = c_int ^ c_long_long;
    C_Type < long long > c_second_long_long = c_int ^ c_long_long;
    PRINT_TYPE( c_first );
    PRINT_TYPE( c_second );
    PRINT_TYPE( c_first_short );
    PRINT_TYPE( c_first_int );
    PRINT_TYPE( c_second_int );
    PRINT_TYPE( c_second_long_long );
}
P-166135
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-10-28 15:17:29
Teraz wszystko jest już jasne, dziękuję :)

Aha jeszcze tylko prosiłbym o odpowiedź, czy faktycznie tak będzie z charami
P-166140
Kinexity
» 2017-10-28 15:47:03
Char to przecież liczba w pamięci, więc tak - tak będzie.
P-166141
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-10-30 22:45:12
Mhm, super. W takim razie to wszystko, danke.
P-166270
« 1 »
  Strona 1 z 1