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

реализация ROR и ROL для int - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
V_Ghost
 Аватар для V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
19.01.2013, 19:33     реализация ROR и ROL для int #1
Помогите реализовать ROR и ROL для чисел типу int, если задано число типу int и количество, на которое идёт сдвиг
ROR/ROL - циклический сдвиг вправо/влево
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V_Ghost
 Аватар для V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 01:44  [ТС]     реализация ROR и ROL для int #21
Toshkarik,
вот например:
вы задали: 0000 0000 0000 0100 0010 0000 0000 0000
значит мы берем только вплоть к старшей единычки:
100 0010 0000 0000 0000
получим:
000 0100 0000 0000 0001
000 1000 0000 0000 0010
001 0000 0000 0000 0100
010 0000 0000 0000 1000
100 0000 0000 0001 0000

Добавлено через 9 минут
KronoZ93, не, не подходит, хочу правильно сделать
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
20.01.2013, 01:50     реализация ROR и ROL для int #22
Do it wrong!
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
20.01.2013, 01:50     реализация ROR и ROL для int #23
Цитата Сообщение от V_Ghost Посмотреть сообщение
Помогите реализовать ROR и ROL для чисел типу int, если задано число типу int и количество, на которое идёт сдвиг
Циклический сдвиг может быть только у unsigned int для int не может знаковый бит мешает

C++
1
2
3
4
5
6
7
8
9
unsigned int ROR(unsigned int n,int q)
{
return (n>>q)|(n<<(sizeof(int)-q));
}
 
unsigned int ROL(unsigned int n,int q)
{
return (n<<q)|(n>>(sizeof(int)-q));
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.01.2013, 01:55     реализация ROR и ROL для int #24
Цитата Сообщение от ValeryS Посмотреть сообщение
Циклический сдвиг может быть только у unsigned int для int не может знаковый бит мешает
Ничего не мешает, вполне будет работать, единственно:
Результат сдвига вправо значения со знаком машинно-зависим.
Некоторые машины заполняют старшие биты нулями, другие используют
для этого знаковый бит.
V_Ghost
 Аватар для V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 01:57  [ТС]     реализация ROR и ROL для int #25
ValeryS, я проверил вашу прогу с числом 10 и сдвигом на 1 бит.
Скажите пжл, как такое возможно, что при 4 битах и максимальном числе 16 оно мне выдало результат 85 ?
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
20.01.2013, 02:21     реализация ROR и ROL для int #26
Цитата Сообщение от Toshkarik Посмотреть сообщение
Ничего не мешает,
сдвиг вправо ( а в нем вся загвоздка ) это деление на 2
т.е. число -2(1111 1110)/2(>>1)=-1(1111 1111)
знаковый бит обязан копироваться

Цитата Сообщение от Toshkarik Посмотреть сообщение
Некоторые машины заполняют старшие биты нулями, другие используют
проверял на куче процессоров и микроконтроллеров везде копируется для int
а для unsigned int да заполняется 0
потому что число
254(1111 1110)/2(>>1)=127(0111 111)

у ассемблера есть две команды логический сдвиг( заполняется 0) и арифметический сдвиг ( копируется старший знаковый бит)

Добавлено через 11 минут
Цитата Сообщение от V_Ghost Посмотреть сообщение
Скажите пжл, как такое возможно, что при 4 битах и максимальном числе 16 оно мне выдало результат 85 ?
нет невозможно это я накосячил (не умножил на количество бит размер int)
вот правильный вариант
C++
1
2
3
4
5
6
7
8
9
unsigned int ROR(unsigned int n,int q)
{
return (n>>q)|(n<<(sizeof(int)*8-q));
}
 
unsigned int ROL(unsigned int n,int q)
{
return (n<<q)|(n>>(sizeof(int)*8-q));
}
Цитата Сообщение от V_Ghost Посмотреть сообщение
при 4 битах и максимальном числе 16
я тебе дал реализацию для int (32 бита)как ты и просил
ни о каких 4 битах речи не было
могу написать для char( 8 бит)
а 4 бита это полубайт нигде не используется
можешь конечно написать
C++
1
2
3
4
unsigned int ROR(unsigned int n,int q)
{
return (n>>q)|(n<<(4-q));
}
Добавлено через 3 минуты
общая функция ( для любого размера )
может выглядеть так
C++
1
2
3
4
5
6
unsigned int ROR(unsigned int n,int q, int size)
{
int m=n&((1<<size)-1)
 
return ((m>>q)|(m<<(size-q)))&((1<<size)-1);
}
V_Ghost
 Аватар для V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 02:41  [ТС]     реализация ROR и ROL для int #27
ValeryS,
я делаю компилятор
у него есть 3 операнди
с 1 и 2 я использую операции, а результат пишу в 3
все эти операнды типа int
Моя задача - дописать возможность ROR/ROL
допустим я ввел число 6 и надо в циклическом сдвиге сдвигнуть на 1 бит
как число 6 хранится в памяти компютера
0000000000000000000000000...000000110
как я должен оперировать с числом: должен брать только 110, и сдвигать на 1 бит, в итоге получу
101 - число 5 (это был пример ROL)
или 011 - 3 (это же - ROR)
в вашем варианте
узял число 10 и сдвигнул на 2 бита - результат получил 2147483650, явно что то не то
а получил потмоучто ві в реализации узял не 4 бита, а все биті хранения числа из памяти компютера

Добавлено через 15 минут
а получил потомучто вы в реализации узяли не 4 бита, а все бити хранения числа из памяти компютера
и при сдвиге вправо младший бит вылез в старший 32-ый бит и получилось такое число
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
20.01.2013, 02:51     реализация ROR и ROL для int #28
во первых я тебе показал как можно работать с другой разрядностью
во вторых
Цитата Сообщение от V_Ghost Посмотреть сообщение
Помогите реализовать ROR и ROL для чисел типу int, если задано число типу int и количество, на которое идёт сдвиг
где написано что у тебя другая разрядность ???
разрядность int 32 байта(для 32 битных ОС)
Цитата Сообщение от V_Ghost Посмотреть сообщение
узял число 10 и сдвигнул на 2 бита - результат получил 2147483650, явно что то не то
что значит не то ???
разрядность числа не может меняться по твоей прихоти
так получается
число 2 это два разряда
число 5 это три
а 30 это пять разрядов так что ли?

Добавлено через 1 минуту
Цитата Сообщение от V_Ghost Посмотреть сообщение
допустим я ввел число 6 и надо в циклическом сдвиге сдвигнуть на 1 бит
как число 6 хранится в памяти компютера
0000000000000000000000000...000000110
как я должен оперировать с числом: должен брать только 110, и сдвигать на 1 бит, в итоге получу
101 - число 5 (это был пример ROL)
сдвиг влево это умножение на 2
как так ты умножаешь 6 на 2 и получаешь 5???

Добавлено через 1 минуту
Цитата Сообщение от V_Ghost Посмотреть сообщение
0000000000000000000000000...000000110
как я должен оперировать с числом: должен брать только 110, и сдвигать на 1 бит,
нет ты должен оперировать всеми 32 разрядами
V_Ghost
 Аватар для V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 02:55  [ТС]     реализация ROR и ROL для int #29
ValeryS,

int - значит что в памяти компьютера число хранится в 32 розрядах. но некоторые могуть быть не информационными, например, если не брать во внимание знаковый разряд, то после самой старшой единички, другие розряди надо откидать, для исполнения ROR/ROL.
Проще говоря - мне надо узнать к-во битов в числе, например int a = 10; (как узнать сколько тут битов на С++ ???)
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
20.01.2013, 03:05     реализация ROR и ROL для int #30
Цитата Сообщение от V_Ghost Посмотреть сообщение
int - значит что в памяти компьютера число хранится в 32 розрядах. но некоторые могуть быть не информационными,
новое слово в информатике
разрядность задается жестко
Цитата Сообщение от V_Ghost Посмотреть сообщение
int a = 10; (как узнать сколько тут битов на С++ ???)
32 в виндосе
16 в досе
C++
1
sizeof(int)*8;
если ты хочешь узнать в каком разряде старшая еденичка
C++
1
2
3
4
5
6
7
int a=10;
int l=0;
while(a)
{
l++;
a/=2;
}
V_Ghost
 Аватар для V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 03:23  [ТС]     реализация ROR и ROL для int #31
Цитата Сообщение от ValeryS Посмотреть сообщение
новое слово в информатике
разрядность задается жестко

32 в виндосе
16 в досе
C++
1
sizeof(int)*8;
если ты хочешь узнать в каком разряде старшая еденичка
C++
1
2
3
4
5
6
7
int a=10;
int l=0;
while(a)
{
l++;
a/=2;
}
Код C++
unsigned int ROR(unsigned int n,int q, int size)
{
int m=n&((1<<size)-1)

return ((m>>q)|(m<<(size-q)))&((1<<size)-1);
}
спасибо, то, что надо)
использовал порядок единички, вместо size
с меня спасибки)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 15:11     реализация ROR и ROL для int
Еще ссылки по теме:

C++ Написать функцию SUM (int M, int N) / С++ для начинающих
Ошибка при компиляции error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void Replase(int**)' C++
C++ В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
20.01.2013, 15:11     реализация ROR и ROL для int #32
для 4 байтных целых
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int frol(int n, int len) {
    for (int i=0; i<len;++i) {
        (n & 0x80000000) ? (n <<= 1)|=1:(n <<= 1)|=0;
        ;
    }
    return n;
}
 
int fror(int n, int len) {
    for (int i=0;i < len; ++i) {
            (n & 0x1) ? (n>>=1)|=0x80000000:(n>>=1)&= 0x7fffffff;
    }
    return n;
}
Добавлено через 11 часов 30 минут
хотя, если почитать фирменную документацию Интела, нужно сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int frol( int n, int len)
{
    int mask =0x80000000; //
    len=(len & 0x1f)%(8*sizeof(n) );
    for (int i=0; i<len; ++i) {
 
        (n & mask) ? (n <<= 1)|=1:(n <<= 1)|=0;
        n<<=1;
        ;
    }
    return n;
}
 
int fror(int n, int len)
{
    int mask=0x80000000;
    len=(len & 0x1f)%(8*sizeof(n));
    for (int i=0; i < len; ++i) {
        (n & 0x1) ? (n>>=1)|=mask:(n>>=1)&=(~mask);
        
    }
    return n;
}
Yandex
Объявления
20.01.2013, 15:11     реализация ROR и ROL для int
Ответ Создать тему
Опции темы

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