Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 26.09.2018
Сообщений: 131
1

Реализовать циклический сдвиг числа влево на указанное число байт

12.04.2023, 06:47. Показов 1360. Ответов 8

Author24 — интернет-сервис помощи студентам
Реализовать циклический сдвиг числа влево на указанное число байт.
Требования:
Ввод исходных данных через параметры командной строки.
Корректность работы реализованной функции с целыми числами различных
размерностей (от 1-го до 8 байт)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.04.2023, 06:47
Ответы с готовыми решениями:

Реализовать циклический сдвиг влево на указанное количество бит
Доброе время! У меня проблема. Мне необходимо реализовать циклический побитовый сдвиг влево, с...

Циклический сдвиг списка вправо или влево на указанное число позиций
def func(l, n): return l + l try: s=input('Введите список чисел через пробел: ') l...

Циклический сдвиг последовательности из N байт памяти на M позиций влево
Алгоритм и программа, осуществляющая циклический сдвиг последовательности из N байт памяти на M...

Реализовать побитный сдвиг числа право на указанное число, но только для нечётных битов
Реализовать побитный сдвиг числа право на указанное число, но только для нечётных битов. Как мне...

Циклический сдвиг число X на K разрядов влево
Добрый день. Нам задали сделать программу, которая циклически сдвигает число X на K разрядов влево....

8
594 / 493 / 102
Регистрация: 05.08.2022
Сообщений: 2,693
12.04.2023, 08:17 2
см. внизу страницы "Похожие темы"
0
1 / 1 / 0
Регистрация: 26.09.2018
Сообщений: 131
12.04.2023, 18:24  [ТС] 3
Я так понял что циклический сдвиг числа влево на указанное число байт это тоже самое что и циклический сдвиг целого числа на n разрядов влево. Если ошибаюсь то поправте.
0
1 / 1 / 0
Регистрация: 26.09.2018
Сообщений: 131
12.04.2023, 23:36  [ТС] 4
Я реализовал сдвиг вправо а сдвиг влево не получается

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <string>
 
unsigned long long shiftl(unsigned char nbyte, unsigned long long nnum);
 
int main(int argc, char** argv) {
 
    setlocale(LC_ALL, "Russian");
    if (argc == 3) {
        unsigned char nbyte;
        unsigned long long nnum;
        try {
            nbyte = static_cast<unsigned char>(std::stoi(argv[1]));
            nnum = std::stoull(argv[2]);
        }
        catch (const std::invalid_argument& ia) {
            std::cerr << "Невозможно преобразовать аргумент(ы) в число типа: " << ia.what() << std::endl;
            return 0;
        }
        unsigned long long copynnum{ nnum };
        if (nbyte >= 1 && nbyte <= 8) {
            nnum = shiftl(nbyte, nnum);
        }
        else {
            std::cerr << "Неверно задано значение nbyte. " << std::endl;
            return 0;
        }
        std::cout << "Исходное значение nnum : \t\t\t" << copynnum << std::endl;
        std::cout << "Значение nnum после циклического сдвига вправо " << nnum << std::endl;
    }
    else {
        std::cout << "Необходимо указать два аргумента командной строки." << std::endl;
    }
    return 0;
}
 
unsigned long long shiftl(unsigned char nbyte, unsigned long long nnum){
    unsigned long long mask;
    switch (nbyte) 
    {
        case 1: mask = 0xFF; break;
        case 2: mask = 0xFFFF; break;
        case 3: mask = 0xFFFFFF; break;
        case 4: mask = 0xFFFFFFFF; break;
        case 5: mask = 0xFFFFFFFFFF; break;
        case 6: mask = 0xFFFFFFFFFFFF; break;
        case 7: mask = 0xFFFFFFFFFFFFFF; break;
        case 8: mask = 0xFFFFFFFFFFFFFFFF; break;
        default:;
    }
    nnum = mask & (((nnum & 0x1) << (nbyte * 8 - 1)) | (nnum >> 1));
    return nnum;
}
0
Модератор
Эксперт С++
13727 / 10923 / 6479
Регистрация: 18.12.2011
Сообщений: 29,156
13.04.2023, 08:47 5
Цитата Сообщение от Zevkiel Посмотреть сообщение
Я реализовал сдвиг вправо
Ну, раз самостоятельно реализовали вправо,
то должны знать, что для сдвига влево надо значки >> << поменять местами
C++
1
    nnum = mask & (((nnum & 0x1) >> (nbyte * 8 - 1)) | (nnum << 1));
0
1 / 1 / 0
Регистрация: 26.09.2018
Сообщений: 131
13.04.2023, 16:04  [ТС] 6
я реализовал по битовый сдвиг влево а по байтово не получается
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <sstream>
using namespace std;
 
 
//Преобразуем число в массив символов, которые представляют число в двоичном виде
void NumToChars(long long num, char num2[], int arr_size) {
    long long one = 1;
    for (int i = arr_size - 1; i >= 0; i--) {
        if (num & (one << i)) {//сдвигаем биты
            num2[arr_size - 1 - i] = '1';
        }
        else {
            num2[arr_size - 1 - i] = '0';
        }
    }
}
//создаем строку из двоичного представления числа, добавляя пробелы для удобства
string CharsToString(char num2[], int arr_size) {
    string s = "";
    for (int i = 0; i < arr_size; i++) {
        s += num2[i];
        if ((i + 1) % 8 == 0)s += " ";
    }return s;
}
//Меням биты в двоичном представлении числа
long long ShiftBits(unsigned long long num, int shift) {
    unsigned long long res = (num << shift) | (num >> (64 - shift));
    return res;
}
//преобразуем двоичное представление в десятиричное число
long long CharsToLongLong(char arr[], int arr_size) {
    long long res = 0;
    int deg;
    for (int i = arr_size - 1; i >= 0; i--) {
        if (arr[i] == '1') {
            deg = arr_size - 1 - i;
            res += pow(2, deg);
        }
    }return res;
}
 
 
int main(int argc, char* argv[]) {
    setlocale(LC_ALL, "ru");
 
    //Если количество аргументов указано верно
    if (argc == 3) {
        unsigned long long num;
        int shift;
        bool correct[2] = { true,true };
        //Создаем из массива символов потоки строк
        stringstream convert[2];
        for (int i = 0; i < 2; i++) {
            convert[i].str(argv[i + 1]);
        }
        //Конвертируем значения
        //конвертируем исходное число
        if (!(convert[0] >> num)) // выполняем конвертацию
            correct[0] = false; // если конвертация терпит неудачу, то отмечаем это
 
        //конвертируем число для сдвига
        if (!(convert[1] >> shift)) // выполняем конвертацию
            correct[1] = false; // если конвертация терпит неудачу, то отмечаем это
 
        //Если конвертация прошла успешно
        if (correct[0] && correct[1]) {
 
            //Если позиция указана верно
            if (shift > 0) {
                //Перевод в двоичный вид
                char input[64];
                NumToChars(num, input, 64);
                cout << "Исходное число в десятиричном виде: " << endl << num << endl;
                cout << "Исходное число в двоичном виде: " << endl << CharsToString(input, 64) << endl;
                //сдвиг
                cout << "Сдвиг влево на число байт: " << shift << endl;
                char res[64];
                unsigned long long r = ShiftBits(num, shift);
                NumToChars(r, res, 64);
                cout << "Результат сдвига:" << endl << CharsToString(res, 64) << endl;
                //перевод из двоичного в лонг лонг
                unsigned long long new_num = CharsToLongLong(res, 64);
                cout << "Получившееся число: " << endl << new_num << endl;
            }
            else { cout << "Число сдвига должно быть больше 0" << endl; }
        }
        //Если конвертация прошла неуспешно
        else {
            cout << "Не получилось преобразовать следующие числа:" << endl;
            if (!correct[0]) { cout << "Исходное число - " << argv[1] << endl; }
            if (!correct[1]) { cout << "Число сдвига - " << argv[2] << endl; }
        }
    }
    //если количество аргументов было другое - говорим какие аргументы и в каком порядке должны быть
    else {
        cout << "Аргументы программы:" << endl;
        cout << "1) Исходное число" << endl;
        cout << "2) число, на которое нужно сдвинуть влево" << endl;
    }
}
0
1 / 1 / 0
Регистрация: 26.09.2018
Сообщений: 131
13.04.2023, 16:06  [ТС] 7
этот метод не работает я ввожу 2 1 в ответ он выводит 2 а когда должен 256

Добавлено через 5 часов 59 минут
я написал код но у меня не получается реализовать побайтовый сдвиг а побитовый работает
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <sstream>
using namespace std;
 
 
//Преобразуем число в массив символов, которые представляют число в двоичном виде
void NumToChars(long long num, char num2[], int arr_size) {
    long long one = 1;
    for (int i = arr_size - 1; i >= 0; i--) {
        if (num & (one << i)) {//сдвигаем биты
            num2[arr_size - 1 - i] = '1';
        }
        else {
            num2[arr_size - 1 - i] = '0';
        }
    }
}
//создаем строку из двоичного представления числа, добавляя пробелы для удобства
string CharsToString(char num2[], int arr_size) {
    string s = "";
    for (int i = 0; i < arr_size; i++) {
        s += num2[i];
        if ((i + 1) % 8 == 0)s += " ";
    }return s;
}
//Меням биты в двоичном представлении числа
long long ShiftBits(unsigned long long num, int shift) {
    unsigned long long res = (num << shift) | (num >> (64 - shift));
    return res;
}
//преобразуем двоичное представление в десятиричное число
long long CharsToLongLong(char arr[], int arr_size) {
    long long res = 0;
    int deg;
    for (int i = arr_size - 1; i >= 0; i--) {
        if (arr[i] == '1') {
            deg = arr_size - 1 - i;
            res += pow(2, deg);
        }
    }return res;
}
 
 
int main(int argc, char* argv[]) {
    setlocale(LC_ALL, "ru");
 
    //Если количество аргументов указано верно
    if (argc == 3) {
        unsigned long long num;
        int shift;
        bool correct[2] = { true,true };
        //Создаем из массива символов потоки строк
        stringstream convert[2];
        for (int i = 0; i < 2; i++) {
            convert[i].str(argv[i + 1]);
        }
        //Конвертируем значения
        //конвертируем исходное число
        if (!(convert[0] >> num)) // выполняем конвертацию
            correct[0] = false; // если конвертация терпит неудачу, то отмечаем это
 
        //конвертируем число для сдвига
        if (!(convert[1] >> shift)) // выполняем конвертацию
            correct[1] = false; // если конвертация терпит неудачу, то отмечаем это
 
        //Если конвертация прошла успешно
        if (correct[0] && correct[1]) {
 
            //Если позиция указана верно
            if (shift > 0) {
                //Перевод в двоичный вид
                char input[64];
                NumToChars(num, input, 64);
                cout << "Исходное число в десятиричном виде: " << endl << num << endl;
                cout << "Исходное число в двоичном виде: " << endl << CharsToString(input, 64) << endl;
                //сдвиг
                cout << "Сдвиг влево на число байт: " << shift << endl;
                char res[64];
                unsigned long long r = ShiftBits(num, shift);
                NumToChars(r, res, 64);
                cout << "Результат сдвига:" << endl << CharsToString(res, 64) << endl;
                //перевод из двоичного в лонг лонг
                unsigned long long new_num = CharsToLongLong(res, 64);
                cout << "Получившееся число: " << endl << new_num << endl;
            }
            else { cout << "Число сдвига должно быть больше 0" << endl; }
        }
        //Если конвертация прошла неуспешно
        else {
            cout << "Не получилось преобразовать следующие числа:" << endl;
            if (!correct[0]) { cout << "Исходное число - " << argv[1] << endl; }
            if (!correct[1]) { cout << "Число сдвига - " << argv[2] << endl; }
        }
    }
    //если количество аргументов было другое - говорим какие аргументы и в каком порядке должны быть
    else {
        cout << "Аргументы программы:" << endl;
        cout << "1) Исходное число" << endl;
        cout << "2) число, на которое нужно сдвинуть влево" << endl;
    }
}
0
495 / 450 / 138
Регистрация: 03.02.2013
Сообщений: 1,394
13.04.2023, 18:21 8
Что характерно в паскале есть для этого rol и ror, в процессорах есть для этого конкретная одна инструкция, а в Си/С++ нужно выдумывать велосипед из нескольких процессорных инструкций, удобно
0
Вездепух
Эксперт CЭксперт С++
12805 / 6679 / 1798
Регистрация: 18.10.2014
Сообщений: 16,911
14.04.2023, 05:11 9
Цитата Сообщение от Zevkiel Посмотреть сообщение
я написал код но у меня не получается реализовать побайтовый сдвиг а побитовый работает
Это как это? Байт - это лишь набор из (восьми?) битов. Если побитовый работает, то и побайтовый будет работать.

И что такое "не получается"?
0
14.04.2023, 05:11
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.04.2023, 05:11
Помогаю со студенческими работами здесь

В заданной строке выполнить циклический сдвиг на указанное число позиций
Строка символов состоит из произвольных десятичных цифр в пределах от 1 до 9, разделенных...

Реализовать программу, которая будет выполнять циклический сдвиг списка влево
Необходимо реализовать программу, которая будет выполнять циклический сдвиг списка влево. Как...

Циклический сдвиг влево цифр числа
Осуществить циклический сдвиг влево введённого числа на N разрядов (например, при сдвиге числа...

Циклический сдвиг числа на n позиций влево
Здравствуйте, в ходе выполнения лабораторной работы с толкнулся с тем, что никак не могу придумать...

Осуществить циклический сдвиг влево введенного числа на N разрядов
Осуществить циклический сдвиг влево введенного числа на N разрядов (например, при сдвиге числа...

Циклический сдвиг целого числа на n разрядов влево и вправо
Такая ситуация. Написать функцию, циклически сдвигающую целое число на N разрядов вправо или влево,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Что такое хорошо и что такое плохо, вид сбоку. Индивид и общество - грань не нарушения.
Hrethgir 18.01.2025
В моей личной жизни и времени, я рассуждаю категорией "хуже-лучше", в том плане, когда меня спросили например - "а зачем ты делаешь свой процессор?", то я ответил - "чтобы сделать свою жизнь лучше". . .
Передача по ссылке или по значению в Java?
InfoMaster 18.01.2025
В мире программирования на Java одним из ключевых аспектов, требующих глубокого понимания, является механизм передачи параметров в методы. Этот фундаментальный концепт часто становится источником. . .
Тернарный условный оператор в Python
InfoMaster 18.01.2025
В мире программирования существует множество инструментов и конструкций, позволяющих создавать эффективный и лаконичный код. Одним из таких инструментов является тернарный условный оператор, который. . .
Как удалить неотслеживаемые файлы из рабочего дерева Git
InfoMaster 18.01.2025
В процессе разработки программного обеспечения с использованием системы контроля версий Git часто возникает необходимость в управлении неотслеживаемыми файлами. Неотслеживаемые файлы (untracked. . .
Что делает код if __name__ == "__main__": в Python
InfoMaster 18.01.2025
В мире программирования на Python существует множество важных концепций, и одной из наиболее интересных является конструкция if __name__ == "__main__". Эта специальная конструкция играет ключевую. . .
Как заставить Git забыть об отслеживаемом файле, добавленном в .gitignore
InfoMaster 18.01.2025
В мире разработки программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса, позволяя эффективно отслеживать изменения в коде и управлять ими. Однако. . .
Что означает use strict в JavaScript и для чего используется
InfoMaster 18.01.2025
В мире современной веб-разработки JavaScript играет ключевую роль как один из основных языков программирования. По мере его эволюции возникла необходимость в механизмах, которые помогли бы. . .
Как работать со скрытыми (hidden) элементами в jQuery
InfoMaster 18.01.2025
В современной веб-разработке управление видимостью элементов на странице является одним из ключевых аспектов создания интерактивных пользовательских интерфейсов. jQuery предоставляет мощный набор. . .
Как переключаться между ветками (Branch) с помощью checkout в Git
InfoMaster 18.01.2025
Ветки в Git являются одной из ключевых концепций для управления версионностью кода, позволяя разработчикам эффективно работать в команде и параллельно развивать программные проекты. Каждый новый. . .
Что такое стек и куча, чем они отличаются и где находятся
InfoMaster 18.01.2025
Понимание основных концепций памяти в программировании В мире современного программирования эффективное управление памятью играет ключевую роль в создании производительных и надежных приложений. . . .
Как использовать комментарии в JSON
InfoMaster 18.01.2025
JSON (JavaScript Object Notation) представляет собой легкий и широко используемый формат обмена данными, который стал стандартом де-факто для веб-приложений и программных интерфейсов. При работе с. . .
Как заставить git pull перезаписать локальные файлы в Git
InfoMaster 18.01.2025
Проблема перезаписи локальных файлов в Git При работе с системой контроля версий Git разработчики часто сталкиваются с ситуацией, когда необходимо синхронизировать локальный репозиторий с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru