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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Массив записать в файл http://www.cyberforum.ru/cpp-beginners/thread748851.html
Добрый день! Не получается записать массив в файл. Файл создается но пустой. Я чувствую тут надо как то через указатель или ссылки. ... int xy; //массив для хранения координат вершин на экране ...
C++ Циклы, массивы, поиск нулевого элемента 6. Дано натуральное число n, целые числа a0,a1,....,an . Сформировать новый массив, исключив из заданного числа, кратные числу 3, которые расположены после последнего нулевого элемента. Если... http://www.cyberforum.ru/cpp-beginners/thread748846.html
unsidned char C++
Имеется функция которая преобразует символы в md5 хэш, взятая отсюда же http://www.cyberforum.ru/cpp-beginners/thread688175.html Необходимо чтобы она возвращала хэш строку.В итоге возвращается не...
C++ библиотеки FFmpeg. Подключение внешнего кодека
Здравствуйте, форумчане. Для написания программы использую ffmpeg библиотеки libavformat и libavcodec. Задача состоит в том, чтобы записывать в контейнер mkv некоторую картинку, которую программа...
C++ Обработать текстовый файл.Напечатать все отрицательные числа из текста http://www.cyberforum.ru/cpp-beginners/thread748837.html
Массивы Обработать текстовый файл.Напечатать все отрицательные числа из текста. Программа не работает #include <cstdlib> #include <iostream> using namespace std;
C++ Коментарии к каждой строчке Напишите пожалуйста коментарии к каждой строчке программы.. #include "stdafx.h" #include <iostream> using namespace std; int is_quadr ( int N ); int _tmain(int argc, _TCHAR* argv) подробнее

Показать сообщение отдельно
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 15:29  [ТС]
Что бесполезно? Доказывать, что циклических сдвигов не бывает? Объясни, что по-твоему означает мнемоника 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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru