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

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

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

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

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

C++
1
2
3
4
5
const uint8_t  *Source;
...
       uint8_t  *Target;
...
*Target=*Source<<BiteShift;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2012, 13:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как гарантировать, что сдвиг не будет циклическим? (C++):

Как гарантировать передачу единственного параметра через стек? - C++
Как гарантировать передачу единтсвуенного параметра функции в виндузячем x64 приложении через стек? Какое соглашение можно для этого...

Численное интегрирование (метод трапеций). Как гарантировать нужную точность? - C++
#include &lt;cmath&gt; #include &lt;iostream&gt; #define PI 3.1415926535 /*----подинтегральная функция---*/ static double INTEGR(const...

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

Что это за знак >> прочитал что это сдвиг вправо? что он делает - C++
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0

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

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

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

Гарантировать, что данные от сервера - C# MVC
Допустим имеется веб-приложение: Где-то на сервере высчитывается зарплата пользователя. Он заходит под своим логином на страницу со...

Что будет происходить с целым числом без знака, если для него выполнить сдвиг вправо на 2 бита? - C (СИ)
Что будет происходить с целым числом без знака, если для него выполнить сдвиг вправо на 2 бита? Приведите пример.

Как гарантировать целостность изменений файлов при обновлении - C#
Есть приложение, у которого имеется несколько конфигурационных текстовых файлов. Внесение изменений хоть в один файл конфигурации...

Найти вероятность того, что стрелы упадут так, что землю можно будет поделить способом (как на рисунке) - Теория вероятностей
Помогите, пожалуйста! Задача: У царя 3 сына. Царь состарился и решил отойти от дел и разделить царство между тремя сыновьями и сделал...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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