4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

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

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

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
const uint8_t  *Source;
...
       uint8_t  *Target;
...
*Target=*Source<<BiteShift;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2012, 13:29
Ответы с готовыми решениями:

Гарантировать что упорядоченная по убыванию последовательность не будет начинаться с 0
Здравствуйте, как добавить условие того что упорядоченная по убыванию последовательность не будет...

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

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

Как гарантировать поочередное выполнение потоков?
есть задача с очередью, там надо поочередно выполнять в отдельном потоке кое что. я использую...

13
98 / 49 / 4
Регистрация: 24.12.2011
Сообщений: 101
28.12.2012, 22:54 2
давай подробнее вопрос. совсем не понятно. у тебя обычный сдвиг. циклическим он стать вроде не может.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 09:23  [ТС] 3
Так вроде по стандарту это не определено, сдвиг и всё, а какой не сказано.
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
30.12.2012, 09:52 4
Если правый операнд содержит отрицательное значение или его значение больше или равно количеству бит в левом операнде, то результат операции не определен.
Я когда писал класс длинной арифметики просто делал: сдвиг%кол-во_бит_в_элементе
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 09:55  [ТС] 5
А если он не превышает разрядность левого операнда, то сдвиг простой по стандарту?
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
30.12.2012, 10:03 6
Ну что-то вроде
C++
1
number<<(rhv%=sizeof(uint8_t));
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
30.12.2012, 12:52 7
Тебя интересует, не появятся ли лишние единицы на освободившихся позициях. Не появятся, иначе сдвиг был бы практически бесполезен.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 12:57  [ТС] 8
Цитата Сообщение от Герц Посмотреть сообщение
Не появятся, иначе сдвиг был бы практически бесполезен.
В системе команд зачем то предусмотрено сразу четыре сдвига, если не шесть, но только два простых, остальные циклические. В данном случае нужен простой сдвиг, но разработчики компиляторов от меня не зависят.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
30.12.2012, 13:09 9
taras atavin, я с вас поражаюсь.
Assembler
1
shl
Assembler
1
sal
неужели не знали?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 13:25  [ТС] 10
Цитата Сообщение от go Посмотреть сообщение
Assembler
1
shl
Assembler
1
sal
тогда 5, или 7 в зависимости от наличия/отсутствия сдвигов через флаг.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
30.12.2012, 13:32 11
Цитата Сообщение от taras atavin Посмотреть сообщение
тогда 5, или 7
Поясните
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 14:18  [ТС] 12
1. Правый простой логический.
2. Левый простой логический.
3. Правый простой арифметический.
4. Левый простой арифметический.
5. Правый циклический.
6. Левый циклический.
7. Правый циклический через флаг переноса.
8. Левый циклический через флаг переноса.
Итого 8, без сдвигов с участием флага 6, в первой четвёрке два сдвига совпадают. Получается 7, или 5.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
30.12.2012, 15:17 13
taras atavin, я понял, что это бесполезно. Уточните задание, и я напишу код.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.12.2012, 15:29
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru