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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
#1

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

19.01.2013, 19:33. Просмотров 2694. Ответов 31
Метки нет (Все метки)

Помогите реализовать ROR и ROL для чисел типу int, если задано число типу int и количество, на которое идёт сдвиг
ROR/ROL - циклический сдвиг вправо/влево
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2013, 19:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос реализация ROR и ROL для int (C++):

Реализация функции char *padl(const char *string, int len, int c=' ') - C++
Реализовать функцию возвращающую указатель на новую строку длины len, полученную из string либо удалением лишних символов слева , либо...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec - C++
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

Преобразовать int в const int для установки размера массива - C++
Добрый вечер всем! Столкнулся с такой нестандартной проблемой. Нужно преобразовать значения типа int в const int, чтоб константная...

Написать функцию SUM (int M, int N) / С++ для начинающих - C++
Написать функцию SUM (int M, int N), которая вычисляет и возвращает сумму всех чисел кратных 3 и 9 в пределах от M и N включительно ....

Моя реализация функции перевода string в int - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int str_to_int(string a); int main() { string s =...

Ошибка при компиляции error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void Replase(int**)' - C++
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #define row 5 #define col 5 using namespace...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 01:24  [ТС] #16
KronoZ93,
если 10 => 1010 сдвинуть на 3 влево, то буде в результате 0101(5), никакого переполнение быть в циклическом сдвиге не может, поскольку к-во битов не меняется в операнде и самы бити не изменяются, они просто двигаются
если 10 => 1010 сдвинуть на 3 вправо, то результат будет 0101 (5)
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.01.2013, 01:25 #17
KronoZ93, как я понял, ТС нужно только первые 4 бита. Или вообще произвольное число бит.
V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 01:29  [ТС] #18
Toshkarik, у меня операнди типа int, но я должен использовать динамически созданное/введеное число
например число 9 - я должен работать только из 4 младшими битами, потомучто при сдвиге единичка в старшем розряде, вместо того что б перейти в 0 младший бит, пойдет в 5 старший бит

Добавлено через 2 минуты
прикол в том, что при динамическом числе мне нужно постоянное динамическое к-во реальных битов в числе, а не все 32, как хранит компютер
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.01.2013, 01:30 #19
V_Ghost, и в каком диапазоне? По старшему биту? Ну например:

0000 0000 0000 0100 0010 0000 0000 0000
Какое число должно получится при сдвиги, скажем, влево на 5?
KronoZ93
4 / 4 / 0
Регистрация: 17.01.2013
Сообщений: 27
20.01.2013, 01:31 #20
Цитата Сообщение от V_Ghost Посмотреть сообщение
Toshkarik, у меня операнди типа int, но я должен использовать динамически созданное/введеное число
например число 9 - я должен работать только из 4 младшими битами, потомучто при сдвиге единичка в старшем розряде, вместо того что б перейти в 0 младший бит, пойдет в 5 старший бит

Добавлено через 2 минуты
прикол в том, что при динамическом числе мне нужно постоянное динамическое к-во реальных битов в числе, а не все 32, как хранит компютер
V_Ghowt если ты делаешь курсач по той же методичке что и я, то вот этот вариант то что надо)
я у препода спрашивал.
V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 01:44  [ТС] #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
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
20.01.2013, 01:50 #22
Do it wrong!
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.01.2013, 01:50 #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
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.01.2013, 01:55 #24
Цитата Сообщение от ValeryS Посмотреть сообщение
Циклический сдвиг может быть только у unsigned int для int не может знаковый бит мешает
Ничего не мешает, вполне будет работать, единственно:
Результат сдвига вправо значения со знаком машинно-зависим.
Некоторые машины заполняют старшие биты нулями, другие используют
для этого знаковый бит.
V_Ghost
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 01:57  [ТС] #25
ValeryS, я проверил вашу прогу с числом 10 и сдвигом на 1 бит.
Скажите пжл, как такое возможно, что при 4 битах и максимальном числе 16 оно мне выдало результат 85 ?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.01.2013, 02:21 #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
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 02:41  [ТС] #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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.01.2013, 02:51 #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
9 / 9 / 0
Регистрация: 03.03.2011
Сообщений: 116
20.01.2013, 02:55  [ТС] #29
ValeryS,

int - значит что в памяти компьютера число хранится в 32 розрядах. но некоторые могуть быть не информационными, например, если не брать во внимание знаковый разряд, то после самой старшой единички, другие розряди надо откидать, для исполнения ROR/ROL.
Проще говоря - мне надо узнать к-во битов в числе, например int a = 10; (как узнать сколько тут битов на С++ ???)
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
20.01.2013, 03:05 #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 03:05
Привет! Вот еще темы с ответами:

В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.? - C++
Не понимаю, с чего начинать. Заранее спс.

для чего нужна эта строчка в с++ int x_step = (iter % 2 == 0 ? 1 : -1); и int y_step = (iter % 2 == 0 ? -1 : 1); - C++
вот int x_step = (iter % 2 == 0 ? 1 : -1); и int y_step = (iter % 2 == 0 ? -1 : 1);

[Linker error] undefined reference to `sterling(int, int, int)' - C++
#include &lt;iostream&gt; using namespace std; int sterling(int,int,int); int sterling(int,int); int sterling(int); int main() { ...

[Linker Error] Unresolved external 'Sort(int near*near ,int, int) - C++
не могу понять в чем ошибка при компиляции ошибок не выдает при запуске программы - выдает эту ошибку Unresolved external 'Sort(int...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.01.2013, 03:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru