[C++ / asembler] Obroty bitowe (z assemblerowymi wstawkami)
Ostatnio zmodyfikowano 2014-12-02 21:18
Rashmistrz Temat założony przez niniejszego użytkownika |
[C++ / asembler] Obroty bitowe (z assemblerowymi wstawkami) » 2014-12-01 21:56:57 C++ nie zawiera operatorów obrotów bitowych. Można zrobić ich "imitację" tak jak jest to na Wikipedii, czyli: "y = (x << n) | (x >> (8-n));", która nie jest oczywiście w pełni sprawna...
1.Jak używając wstawek Asemblerowych użyć instrukcji obrotu bitowego? 2.Jak stworzyć tenże operator tak, by potem nie musieć wpisywać, w miejscach występowania tej operacji, tychże wstawek? 3.Jaka jest różnica pomiędzy instrukcjami ROL, RCL i SAL?
Jak na razie tylko te trzy pytania mnie dręczą, reszta przyjdzie prawdopodobnie z czasem i kolejnymi informacjami na ten temat. : -_/ |
|
Elaine |
» 2014-12-01 22:28:31 Po co ci do tego wstawki? Co jest nie tak z tym? template < typename T > constexpr T rotate_left( T number, unsigned how_much ) { static_assert( std::is_unsigned < T > { }, "T should be unsigned" ); return( number << how_much ) |( number >>( std::numeric_limits < T >::digits - how_much ) ); } |
|
kubawal |
» 2014-12-01 22:49:21 Poczytaj sobie o rozszerzonych wstawkach asemblerowych z GCC w manualu. One doskonale nadają się do takich zastosowań. |
|
Rashmistrz Temat założony przez niniejszego użytkownika |
» 2014-12-01 23:18:53 Nie wiem co mnie uwzięło, ale chcę użyć tych wstawek, jednak nie mogę ich użyć, bo za mało się jeszcze na tym znam. Dziękuję za porady. C: Jak na razie starczy mi to: -Obrócenie 8 bitowego słowa w lewo o "n": y =( x <<( n & 7 ) ) |( x >> 8 -( n & 7 ) ); . (Aby obrócić w prawo wystarczy odwrócić przesunięcia bitowe) (Te n & 7 zastępuje mi powolniejsze n % 8 ) |
|
1aam2am1 |
» 2014-12-02 08:17:09 http://parzych.net/2010/06/assembler-pigulka-najwazniejsze-komendy-rejestry-przyklady/
|
|
Elaine |
» 2014-12-02 13:17:39 (Te n & 7 zastępuje mi powolniejsze n % 8 ) |
Tylko ci się zdaje. |
|
1aam2am1 |
» 2014-12-02 15:28:47 static inline uint32_t rotl32_i64_asm( uint32_t & value, unsigned shift ) { asm volatile( "rol %%cl, %0": "=r"( value ) : "0"( value ) , "c"( shift ) ); return value; }
Trudno było ale działa. |
|
Rashmistrz Temat założony przez niniejszego użytkownika |
» 2014-12-02 15:46:04 // cała moja wiadomość którą pisałem przez ostatnie //25 minut się skasowała w nie wyjaśniony sposób... Te n & 7 zastępuje mi powolniejsze n % 8 | Tylko ci się zdaje. |
Widać że nie rozumiesz tego triku... Przykład: 0101'0101(85) 0000'0111(7) 85 % 8 = 5; 0101'0101 & 0000'0111 = 5; Jeszcze więcej przykładów: Wiemy że: 0 % x = 0; 2^x % 8 = 0; Dla x>2; 0*2^7 + 1*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 1*2^2 + 0*2^1 1*2^0 = 85; 0*128 + 1*64 + 0*32 + 1*16 + 0*8 + 1*4 + 0*2 1*1 = 85; 0 + 64 + 0 + 16 + 0 + 4 + 0 + 1 = 85; / %8 0%8 + 64%8 + 0%8 + 16%8 + 0%8 + 4%8 + 0%8 + 1%8 = 85 % 8; 0 + 0 + 0 + 0 + 0 + 4 + 0 + 1 = 5; 4 + 1 = 5; PRAWDA! >:D Wystarczy podstawić "x", który jest liczbą naturalną: n % 2^x = n & (2^x-1); Tak samo można zrobić dla naszego systemu dziesiętnego. Rozumiesz już? |
|
« 1 » 2 |