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

Как гарантировать, что сдвиг не будет циклическим? - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.12.2012, 13:29     Как гарантировать, что сдвиг не будет циклическим? #1
C++
1
2
3
4
5
const uint8_t  *Source;
...
       uint8_t  *Target;
...
*Target=*Source<<BiteShift;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2012, 13:29     Как гарантировать, что сдвиг не будет циклическим?
Посмотрите здесь:

что будет? C++
Что будет? C++
C++ Является ли первая строка циклическим сдвигом второй строки
Что такое циклический сдвиг элементов матрицы C++
Написать программу с циклическим процессом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cybersonner
 Аватар для cybersonner
97 / 48 / 3
Регистрация: 24.12.2011
Сообщений: 101
28.12.2012, 22:54     Как гарантировать, что сдвиг не будет циклическим? #2
давай подробнее вопрос. совсем не понятно. у тебя обычный сдвиг. циклическим он стать вроде не может.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 09:23  [ТС]     Как гарантировать, что сдвиг не будет циклическим? #3
Так вроде по стандарту это не определено, сдвиг и всё, а какой не сказано.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
30.12.2012, 09:52     Как гарантировать, что сдвиг не будет циклическим? #4
Если правый операнд содержит отрицательное значение или его значение больше или равно количеству бит в левом операнде, то результат операции не определен.
Я когда писал класс длинной арифметики просто делал: сдвиг%кол-во_бит_в_элементе
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 09:55  [ТС]     Как гарантировать, что сдвиг не будет циклическим? #5
А если он не превышает разрядность левого операнда, то сдвиг простой по стандарту?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
30.12.2012, 10:03     Как гарантировать, что сдвиг не будет циклическим? #6
Ну что-то вроде
C++
1
number<<(rhv%=sizeof(uint8_t));
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
30.12.2012, 12:52     Как гарантировать, что сдвиг не будет циклическим? #7
Тебя интересует, не появятся ли лишние единицы на освободившихся позициях. Не появятся, иначе сдвиг был бы практически бесполезен.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 12:57  [ТС]     Как гарантировать, что сдвиг не будет циклическим? #8
Цитата Сообщение от Герц Посмотреть сообщение
Не появятся, иначе сдвиг был бы практически бесполезен.
В системе команд зачем то предусмотрено сразу четыре сдвига, если не шесть, но только два простых, остальные циклические. В данном случае нужен простой сдвиг, но разработчики компиляторов от меня не зависят.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
30.12.2012, 13:09     Как гарантировать, что сдвиг не будет циклическим? #9
taras atavin, я с вас поражаюсь.
Assembler
1
shl
Assembler
1
sal
неужели не знали?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 13:25  [ТС]     Как гарантировать, что сдвиг не будет циклическим? #10
Цитата Сообщение от go Посмотреть сообщение
Assembler
1
shl
Assembler
1
sal
тогда 5, или 7 в зависимости от наличия/отсутствия сдвигов через флаг.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
30.12.2012, 13:32     Как гарантировать, что сдвиг не будет циклическим? #11
Цитата Сообщение от taras atavin Посмотреть сообщение
тогда 5, или 7
Поясните
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 14:18  [ТС]     Как гарантировать, что сдвиг не будет циклическим? #12
1. Правый простой логический.
2. Левый простой логический.
3. Правый простой арифметический.
4. Левый простой арифметический.
5. Правый циклический.
6. Левый циклический.
7. Правый циклический через флаг переноса.
8. Левый циклический через флаг переноса.
Итого 8, без сдвигов с участием флага 6, в первой четвёрке два сдвига совпадают. Получается 7, или 5.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
30.12.2012, 15:17     Как гарантировать, что сдвиг не будет циклическим? #13
taras atavin, я понял, что это бесполезно. Уточните задание, и я напишу код.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2012, 15:29     Как гарантировать, что сдвиг не будет циклическим?
Еще ссылки по теме:

Ребят, нужно написать программу шифровки циклическим сдвигом C++
C++ Численное интегрирование (метод трапеций). Как гарантировать нужную точность?
Как гарантировать передачу единственного параметра через стек? C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 15:29  [ТС]     Как гарантировать, что сдвиг не будет циклическим? #14
Что бесполезно? Доказывать, что циклических сдвигов не бывает? Объясни, что по-твоему означает мнемоника RAR. Мне надо гарантировать, что сдвиг циклическим не будет. Пока исходник оператора такой:
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
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Longs         ::
TInteger
Longs         ::
TInteger      :: operator <<      (const        TInteger &Right ) const
{
 const uint8_t  *Source;
 const uint8_t  *SourceEnd;
 const uint8_t  *Next;
 const uint8_t  *RightByte;
       uint8_t  *Target;
       uint8_t  *TargetEnd;
       TInteger  Result;
       size_t    Shift;
       size_t    ByteShift;
       size_t    BiteShift;
       uint8_t   Buffer;
       uint8_t   Masks[2];
 if (((*Right.Data)&0x80)==0x80)
 {
  return *this>>-Right;
 }
 for (RightByte=Right.Data+0xFB; RightByte>=Right.Data; --RightByte)
 {
  if ((*RightByte)!=0x00)
  {
   for (Target=Result.Data+0xFF; Target>=Result.Data; --Target)
   {
    *Target=0x00;
   }
   return Result;
  }
 }
 Shift=(int32_t)Right;
 if (Shift==0x00000000)
 {
  return *this;
 }
 ByteShift=Shift/8;
 BiteShift=Shift%8;
 if (ByteShift>=0x100)
 {
  for (Target=Result.Data+0xFF; Target>=Result.Data; --Target)
  {
   *Target=0x00;
  }
  return Result;
 }
 Masks[0]=(uint8_t)((0xFF)<<BiteShift);
 Masks[1]=~Masks[0];
 for (Target=Result.Data, Source=Data+ByteShift, TargetEnd=Result.Data+0xFF-ByteShift, SourceEnd=Data+0xFF; Target<=TargetEnd; ++Target, ++Source)
 {
  Buffer=0x00;
  Buffer|=((*Source)<<BiteShift)&Masks[0];
  if ((BiteShift!=0)&&(Source<SourceEnd))
  {
   Next=Source+1;
   Buffer|=((uint8_t)(((((uint16_t)(*Next))<<BiteShift)&0xFF00)>>8))&Masks[1];
  }
  *Target=Buffer;
 }
 for (TargetEnd=Result.Data+0xFF; Target<=TargetEnd; ++Target)
 {
  *Target=0x00;
 }
 return Result;
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
. Надо гарантировано не циклически двинуть число, представленное массивом цифр в системе с основаниями 2 и 256, двигать надо биты, игнорируя границы байт, слов и всего остального, кроме границ всего массива. Оператор используется в операторе двоичного деления.

Добавлено через 1 минуту
Поддерживать байты другого размера, кроме 8-ми бит не нужно.
Yandex
Объявления
30.12.2012, 15:29     Как гарантировать, что сдвиг не будет циклическим?
Ответ Создать тему
Опции темы

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