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

Выполнить свертку байтов в диапазоне - C++

Восстановить пароль Регистрация
 
Lucky Ritsu
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 7
29.11.2013, 22:47     Выполнить свертку байтов в диапазоне #1
Добрый день, я очень-очень плохой студент и очень-очень не понимаю программирование, а хотелось бы.
Читаю разные самоучители и прочее..
Но данные задания
Раз
Написать программу, которая получает случайное целое типа int, выводит его двоичное представление на экран, выполняет преобразование в соответствии с вариантом (см. ниже), затем выводит на экран двоичное представление результата преобразования.
Назовем сверткой байта порядка N операцию циклического сдвига старшей тетрады на N битов вправо, а младшей тетрады на N битов влево. Выполнить свертку всех байтов на случайное число из диапазона0..3
Пример: 0xDEADBEEF -> 0x7BA7EBBF (N = 2)

два
Если в числе встречается последовательность битов 000, заменить её на 0110 (лишние разряды сдвигать влево)
Пример:
11010001 -> 10101101

нужно сделать к следующей неделе, чего не имею возможности сделать в силу скудных знаний и нехватки времени.


Кто-нибудь из вас, великие, может по хардкору написать код в СИ на уровне начала первого курса и объяснить что да как?
С меня печеньки! :3
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2013, 22:47     Выполнить свертку байтов в диапазоне
Посмотрите здесь:

Сумма байтов C++
порядок байтов C++
Замена байтов/битов C++
C++ Неправильное выделение байтов
C++ реверсировать список байтов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
29.11.2013, 23:19     Выполнить свертку байтов в диапазоне #2
Lucky Ritsu, твоя "сложная" задача задела меня за живое Но в данный момент башка уже хочет упасть на клавиатуру. Боюсь напортачить. Но пару дней еще есть, не правда ли? Вот завтра и разберемся (если никто не сделает этого раньше, в чем я почти уверен)
Liden
17 / 17 / 2
Регистрация: 19.11.2013
Сообщений: 83
30.11.2013, 02:07     Выполнить свертку байтов в диапазоне #3
Lucky Ritsu, сдвиг циклический?
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
30.11.2013, 11:21     Выполнить свертку байтов в диапазоне #4
Два
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
int main()
{
char s[40], t[80], *p, *q, *tt;
int n = rand();
itoa(n, s, 2);
cout << s << endl; // Это исходное число в двоичном представлении
for(p = s, tt=t; (q=strstr(p, "000"))!=NULL; p = q+3) {
   memcpy(tt, p, q-p);
   tt += q - p - 1;
   memcpy(tt, "0110", 4);
   tt += 4;
}
strcpy(tt, p); // Переписываем остаток
cout << t << endl; // Результирующее число
return 0;
}
Не проверял, но идея, надеюсь, ясна

Добавлено через 22 минуты
Один
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
int main()
{ int n, N; char s[40]; unsigned char bait, up, low, t, *p;
 n = rand(); // Исходное число
 N = rand() % 4; // Величина сдвига
 itoa(n, s, 2); // Преобразование по основанию 2 в строку s
 cout << s << endl;
 p = (unsigned char *)(&n); // Рассматриваем число как последовательность байтов
 for(i=0; i<sizeof(int); i++) {
   bait = p[i];
   up = (bait & 240); // Старший байт
   low = (bait & 15);
   t = (up >> N);  // Свертка
   up = (((t & 15) << 4) | (t&240));
   t = (low << N);
   low = ((t &15) | ((t & 240)>>4)));
   p[i] = (up | low);
 }
 itoa(n, s, 2);
 cout << s <, endl;
 return 0;
}
Вот как-то так...
Lucky Ritsu
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 7
30.11.2013, 15:26  [ТС]     Выполнить свертку байтов в диапазоне #5
Обе программы выдают кучу ошибок, но ,после "очистки" от синтаксических ошибок и лишних скобочек, остается только это..
Загуглил, понял, что можно заменить, но при попытке выдает это: тык-с
Байт, как с этим бороться?
Вика посоветовала <stdlib.h> подцепить, но не помогло
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
30.11.2013, 17:06     Выполнить свертку байтов в диапазоне #6
Lucky Ritsu, да, эта чудесная функция itoa не входит в стандарт и часто не поддерживается. Придется реализовывать самим. Это не очень сложно. Тут вся фишка в том, что я получил строку представления сразу в двоичной системе, не пришлось переводить.
Но ты пошел другим путем и используешь printf (т.е. на чистом СИ, да?). И как-то не так его используешь. Там первый аргумент - формат выдачи - const char *. Скорее всего ты его пропустил. Если не разберешься - покажь свой исходник.

Добавлено через 20 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void myItoa(unsigned int n, char *s)
{ unsigned int k, i;
   for(k=1; k<=n; k*=2);
   k /= 2;
   for(i=0; k; i++) {
     if (n/k) { s[i] = '1'; n -= k; }
     else     s[i] = '0';
     k /= 2;
   }
   s[i] = '\0';
}
int main(int ac, char *av[])
{  int n; char s[20];
  if (ac<2) return 1;
  n = atoi(av[1]);
  myItoa(n, s);
  printf("%d = %s\n", n, s);
}
На этот раз не поленился - проверил
Lucky Ritsu
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 7
03.12.2013, 20:14  [ТС]     Выполнить свертку байтов в диапазоне #7
не знаю, в чём дело, но теперь ошибок ещё больше, а сами они стали ещё запутанней
Такое вот выдает..
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
03.12.2013, 20:30     Выполнить свертку байтов в диапазоне #8
Цитата Сообщение от Байт Посмотреть сообщение
Если не разберешься - покажь свой исходник.
У тебя там явные ошибки из-за полного незнания языка. На это мне хватило экстрасенсорных способностей. И не надо ничего показывать в картинках. Выложи текст. На крайняк - приложи заархированный проект.
Lucky Ritsu
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 7
03.12.2013, 20:32  [ТС]     Выполнить свертку байтов в диапазоне #9
Но я копипастирую твой код.
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
03.12.2013, 20:35     Выполнить свертку байтов в диапазоне #10
Цитата Сообщение от Lucky Ritsu Посмотреть сообщение
я копипастирую твой код.
Ничего умнее не придумал?
Ладно, на этом закончим беседу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 20:36     Выполнить свертку байтов в диапазоне
Еще ссылки по теме:

Порядок байтов C++
C++ Сравнение байтов в bitset
C++ Сумма байтов числа

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

Или воспользуйтесь поиском по форуму:
Lucky Ritsu
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 7
03.12.2013, 20:36  [ТС]     Выполнить свертку байтов в диапазоне #11
Цитата Сообщение от Lucky Ritsu Посмотреть сообщение
я очень-очень плохой студент и очень-очень не понимаю программирование
Цитата Сообщение от Байт Посмотреть сообщение
Ничего умнее не придумал?
Ок.
Спасибо и на том.
Yandex
Объявления
03.12.2013, 20:36     Выполнить свертку байтов в диапазоне
Ответ Создать тему
Опции темы

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