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

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

Войти
Регистрация
Восстановить пароль
 
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

28.12.2012, 13:29. Просмотров 447. Ответов 13
Метки нет (Все метки)

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++
Как гарантировать передачу единтсвуенного параметра функции в виндузячем x64 приложении через стек? Какое соглашение можно для этого...

Как сделать алфавит циклическим? С4 по информатике - C++
Здравствуйте. Нужна помощь с задачей c4 по информатике. Условия задачи с моей попыткой решения здесь - Запрещено создавать темы в...

Как запустить внешнее консольное приложение и получить то, что будет выведено на экран? - C++
Есть программка которая распознает капчу, когда я ее запускаю из командной строки выводится значение капчи на экран от так вызываю да...

Inline функции: как обеспечить уверенность в том, что заданный код, абсолютно всегда будет инлайниться? - C++
Вопрос заключается в следующем: как обеспечить уверенность в том, что приведенный ниже код, абсолютно всегда будет инлайниться? Это...

Что такое циклический сдвиг элементов матрицы - C++
подробно своими словами пожалуйста)

Что будет? - C++
Что будет если пару раз вызвать вот такую штуку? mLastTrack-&gt;sampleTable = new SampleTable(mDataSource); Спасибо!

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cybersonner
97 / 48 / 3
Регистрация: 24.12.2011
Сообщений: 101
28.12.2012, 22:54     Как гарантировать, что сдвиг не будет циклическим? #2
давай подробнее вопрос. совсем не понятно. у тебя обычный сдвиг. циклическим он стать вроде не может.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 09:23  [ТС]     Как гарантировать, что сдвиг не будет циклическим? #3
Так вроде по стандарту это не определено, сдвиг и всё, а какой не сказано.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
30.12.2012, 09:52     Как гарантировать, что сдвиг не будет циклическим? #4
Если правый операнд содержит отрицательное значение или его значение больше или равно количеству бит в левом операнде, то результат операции не определен.
Я когда писал класс длинной арифметики просто делал: сдвиг%кол-во_бит_в_элементе
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 09:55  [ТС]     Как гарантировать, что сдвиг не будет циклическим? #5
А если он не превышает разрядность левого операнда, то сдвиг простой по стандарту?
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
30.12.2012, 10:03     Как гарантировать, что сдвиг не будет циклическим? #6
Ну что-то вроде
C++
1
number<<(rhv%=sizeof(uint8_t));
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
30.12.2012, 12:52     Как гарантировать, что сдвиг не будет циклическим? #7
Тебя интересует, не появятся ли лишние единицы на освободившихся позициях. Не появятся, иначе сдвиг был бы практически бесполезен.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 12:57  [ТС]     Как гарантировать, что сдвиг не будет циклическим? #8
Цитата Сообщение от Герц Посмотреть сообщение
Не появятся, иначе сдвиг был бы практически бесполезен.
В системе команд зачем то предусмотрено сразу четыре сдвига, если не шесть, но только два простых, остальные циклические. В данном случае нужен простой сдвиг, но разработчики компиляторов от меня не зависят.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
30.12.2012, 13:09     Как гарантировать, что сдвиг не будет циклическим? #9
taras atavin, я с вас поражаюсь.
Assembler
1
shl
Assembler
1
sal
неужели не знали?
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++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
30.12.2012, 13:32     Как гарантировать, что сдвиг не будет циклическим? #11
Цитата Сообщение от taras atavin Посмотреть сообщение
тогда 5, или 7
Поясните
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++
3586 / 1366 / 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++
что случится если запустить такой код :scratch: long int *p, i = 0; while(1) { i++; p ;

Написать программу с циклическим процессом - C++
Условие: подрабатывая вечером курьером, студент решил накопить сумму в S рублей для покупки компьютера. В первый месяц он отложил P рублей....

что быстрее работать будет?? - C++
Здравствуйте) проблема такая. есть функция, возвращаемое значение которой расчитывается по разным формулам, выбор которых зависит от...

Что будет выведено на экран? - C++
Увидел только что такую вот интересную задачку на одном форуме #include &lt;iostream&gt; struct aaa { aaa(int i) { ...


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

Или воспользуйтесь поиском по форуму:
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     Как гарантировать, что сдвиг не будет циклическим?
Ответ Создать тему
Опции темы

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