Форум программистов, компьютерный форум CyberForum.ru

циклические сдвиги - C++

Восстановить пароль Регистрация
 
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
09.05.2013, 22:02     циклические сдвиги #1
Как организовать циклический сдвиг числа? Например у меня есть число 5. В двоичной системе это выглядит как 0101, и мне нужно сделать так чтобы старший бит переместился в младший, то есть, чтобы стало 1010. Как это реализовать с помощью операторов сдвига?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2013, 22:02     циклические сдвиги
Посмотрите здесь:

Сдвиги C++
Циклические сдвиги C++
Сдвиги. (<< и >>) C++
Побитовые сдвиги C++
C++ Побитовые сдвиги
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
09.05.2013, 22:14     циклические сдвиги #2
Why so seriouS, старший бит всегда = 1, если вы имеете ввиду фиксированную длину, то говорите сколько всего разрядов.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
09.05.2013, 23:35     циклические сдвиги #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <bitset> 
 
 
int main()
{
    int x=5;
    x=x<<1;
 std::cout<<x<<"\t";
 std::cout << std::bitset<sizeof(x) * 8>(x) << std::endl; 
 std::cin.get();
 
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
10.05.2013, 03:38     циклические сдвиги #4
Цитата Сообщение от Why so seriouS Посмотреть сообщение
Как это реализовать с помощью операторов сдвига?
Значение старшего бита в переменную. Затем сдвиг всего числа влево и потом Number & <старший_бит>

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <climits>
typedef unsigned short int USINT;
 
USINT RCyrShift(USINT number){
    int bits;
    for(bits=sizeof(number)*CHAR_BIT-1;bits>=0;--bits){
        if(number&(1<<bits))
            break;
    }
    if (bits<=0) return number;
    return (number>>1)|((number&1)<<bits);
}
USINT LCyrShift(USINT number){
    int bits;
    for(bits=sizeof(number)*CHAR_BIT-1;bits>=0;--bits){
        if(number&(1<<bits))
            break;
    }
    if (bits<=0) return number;
    USINT mask=number&(1<<bits);
    return ((number & ~mask)<<1)|(mask>>bits);
}
 
int main(){
    USINT number;
    std::cout<<"Number ->";
    std::cin>>number;
    std::cout<<"Left: "<<LCyrShift(number)<<std::endl;
    std::cout<<"Right: "<<RCyrShift(number)<<std::endl;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.05.2013, 12:39     циклические сдвиги #5
Можно с вектором извратиться:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <algorithm>
#include <vector>
 
int main()
{
    const int bitlen = 4;
    const int value = 5;
    
    std::vector<bool> v;
 
    for( int i=0; i<bitlen; ++i )
    {
        v.push_back( value << i & 1 << bitlen-1 );
    }
 
    std::rotate( v.begin(), v.begin()+1, v.end() );
 
    for( auto bit : v )
    {
        std::cout << bit;
    }
 
    std::system( "pause" );
    return 0;
}
Yandex
Объявления
10.05.2013, 12:39     циклические сдвиги
Ответ Создать тему
Опции темы

Текущее время: 23:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru