Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > циклический сдвиг переменнойв


Автор: semibug 20.7.2010, 16:33
Каким наиболее простым способом можно осуществить сдвиг значения 32-х битной переменной влево на один разряд с переносом старшего бита в младший (т.е. сдвиг по кольцу)?

Автор: azesmcar 20.7.2010, 16:51
Код

unsigned int cyclic_shift(unsigned int x)
{
    return (x << 1) | (x >> (8 * sizeof(x) - 1));
}

?

Автор: semibug 20.7.2010, 18:41
azesmcar, спасибо. Как считаете, компилятор сообразит что достаточно одной ассемблерной инструкции цикличного сдвига?

Автор: bsa 20.7.2010, 20:40
Цитата(semibug @  20.7.2010,  19:41 Найти цитируемый пост)
azesmcar, спасибо. Как считаете, компилятор сообразит что достаточно одной ассемблерной инструкции цикличного сдвига?

gcc 4.4 сообразил:
Код
        .file   "aa.cpp"
        .text
.globl _Z12cyclic_shiftj
        .type   _Z12cyclic_shiftj, @function
_Z12cyclic_shiftj:
.LFB0:
        .cfi_startproc
        .cfi_personality 0x3,__gxx_personality_v0
        pushq   %rbp
        .cfi_def_cfa_offset 16
        movq    %rsp, %rbp
        .cfi_offset 6, -16
        .cfi_def_cfa_register 6
        movl    %edi, -4(%rbp)
        movl    -4(%rbp), %eax
        rorl    $31, %eax
        leave
        ret
        .cfi_endproc
.LFE0:
        .size   _Z12cyclic_shiftj, .-_Z12cyclic_shiftj
        .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
        .section        .note.GNU-stack,"",@progbits

Автор: azesmcar 21.7.2010, 08:41
Цитата(semibug @  20.7.2010,  18:41 Найти цитируемый пост)
Как считаете, компилятор сообразит что достаточно одной ассемблерной инструкции цикличного сдвига?

это надо проверять на конкретном компиляторе.

Автор: borisbn 21.7.2010, 10:06
MSVC 2008 в debug сделал всё по отдельным командам ( ессно ), а в release - тоже одна операция
Цитата

; 23   :     return ( x << 1 ) | ( x >> ( 8 * sizeof( x ) - 1 ) );

  00000    8b 44 24 04  mov  eax, DWORD PTR _x$[esp-4]
  00004    d1 c0   rol  eax, 1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)