XOR - kiedy ciągi bitów są różnej długości.
Ostatnio zmodyfikowano 2017-10-30 22:45
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ć? |
|
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. |
|
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 |
|
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: #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 ); } |
|
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 |
|
Kinexity |
» 2017-10-28 15:47:03 Char to przecież liczba w pamięci, więc tak - tak będzie. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-10-30 22:45:12 Mhm, super. W takim razie to wszystko, danke. |
|
« 1 » |