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

[C++ / asembler] Obroty bitowe (z assemblerowymi wstawkami)

Ostatnio zmodyfikowano 2014-12-02 21:18
Autor Wiadomość
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. : -_/
P-121889
Elaine
» 2014-12-01 22:28:31
Po co ci do tego wstawki? Co jest nie tak z tym?
C/C++
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 ) );
}
P-121897
kubawal
» 2014-12-01 22:49:21
Poczytaj sobie o rozszerzonych wstawkach asemblerowych z GCC w manualu.
One doskonale nadają się do takich zastosowań.
P-121906
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
)


P-121909
1aam2am1
» 2014-12-02 08:17:09
http://parzych.net/2010/06/assembler-pigulka-najwazniejsze-komendy-rejestry-przyklady/

P-121915
Elaine
» 2014-12-02 13:17:39
(Te
n & 7
 zastępuje mi powolniejsze
n % 8
)
Tylko ci się zdaje.
P-121926
1aam2am1
» 2014-12-02 15:28:47
C/C++
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.
P-121937
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ż?
P-121938
« 1 » 2
  Strona 1 z 2 Następna strona