Циклический сдвиг с: Циклический сдвиг для 2^p разрядного числа на основе битовых операций
Битовый сдвиг — Википедия
Би́товый сдвиг — изменение позиций бит в машинном слове.
Большинство компьютеров не могут напрямую адресовать биты, которые содержатся группами по 8, 16, 32 или 64 бита в машинном слове. Для обеспечения работы с битами существует множество машинных инструкций, включающие различные типы сдвигов. Все сдвиги похожи друг на друга поведением средних битов, которые просто сдвигаются влево или вправо на определённую величину. Однако, поведение крайних битов, которые уходят из слова и которые появляются в слове, зависит от типа сдвига.
В электронике битовые сдвиги выполняются на сдвиговых регистрах.
Логический сдвиг
Логический сдвиг влево | Логический сдвиг вправо |
Сдвиг, при котором уходящий бит исчезает, не влияя на оставшиеся биты, а на месте появившегося бита записывается бит 0.
Пример работы операции сдвига:
- Пусть у нас есть число 10101010b (в двоичной системе).
- Если сделать сдвиг влево на 1 бит, то получим число 01010100b.
- Если сделать сдвиг исходного числа вправо на 1 бит, то получим число 01010101b.
В большинстве процессоров уходящий бит сохраняется во флаге переноса. Эта функция широко используется при работе со многобайтовыми числами.
Арифметический сдвиг
Арифметический сдвиг влево | Арифметический сдвиг вправо |
При этом сдвиге слово рассматривается не просто как группа битов, а как целое число в дополнительном коде.
При сдвиге влево ведёт себя как логический сдвиг, при сдвиге вправо уходящий бит исчезает, не влияя на оставшиеся биты, а на месте появившегося бита устанавливается бит, соответствующий знаку.
Пример №1
Пример работы операции сдвига 8 битного числа в прямом коде:
- Пусть у нас есть 8 битное число: 0000 0010b = 2. (записанное в двоичной системе, в прямом коде).
- Cдвиг влево на 1 бит, дает число: 00000100b = 4.
- Сдвиг вправо на 1 бит, дает число: 00000001b = 1.
Пример №2
Пример работы операции сдвига 8 битного числа записанного в дополнительном до 2х коде:
- Пусть у нас есть число 11111010b = −6 (в двоичной системе, в дополнительном коде).
- Если сделать сдвиг влево на 1 бит, то получим число 11110100b = −12.
- Если сделать сдвиг исходного числа вправо на 1 бит, то получим число 11111101b = −3.
Вывод
Легко заметить, что при арифметическом сдвиге сдвиг влево соответствует умножению на 2, а сдвиг вправо — делению на 2 (в общем случае — на основание системы счисления) с округлением к −∞. Например:
1011 = −5 1111 = −1 >>a 1 >>a 1 ---- ---- 1101 = −3 1111 = −1
Схемотехническая реализация операций сдвига очень проста. Именно поэтому эти операции рекомендуют использовать для операций умножения и деления целых чисел на числа, равные степени 2 (2, 4, 8, 16, 32, 64 и т. д.) — если, конечно, такое округление отрицательных чисел не мешает.
Циклический сдвиг
Циклический сдвиг влево | Циклический сдвиг вправо |
При этом сдвиге уходящий бит появляется на месте появившегося свободного на другом конце числа.
Пример
- Пусть у нас есть число 11111010b (в двоичной системе).
- Если сделать сдвиг влево на 1 бит, то получим число 11110101b.
- Если сделать сдвиг вправо на 1 бит, то получим число 11111010b.
Циклический сдвиг через бит переноса
Циклический сдвиг влево через бит переноса | Циклический сдвиг вправо через бит переноса |
В архитектуру многих процессоров входит флаг переноса в следующий разряд (например, cf
на x86). Данная операция выполняет циклический сдвиг над (n+1)-битным числом, состоящим из регистра и флага переноса.
Например, если у нас в регистре число 11111010b, флаг переноса циклического сдвига вправо равен 0.
- После сдвига влево на 1 бит в регистре 11110101b, флаг переноса равен 1.
- После сдвига вправо на 1 бит в регистре 01111101b, флаг переноса равен 1.
Операция циклического сдвига через бит переноса используется при работе с многобайтовыми числами. В частности, чтобы сдвинуть вправо на 1 бит длинное число, нужно очистить[1]cf
(в случае деления числа со знаком нужно записать в cf
старший бит старшего слова) и циклически сдвинуть на единицу через cf
каждое слово, начиная с верхнего. Например, пусть у нас есть число 011000111100b, занимающее три 4-битных слова:
Было: HI=0110, MED=0011, LO=1100, cf=0 После сдвига HI: HI=0011, MED=0011, LO=1100, cf=0 После сдвига MED: HI=0011, MED=0001, LO=1100, cf=1 После сдвига LO: HI=0011, MED=0001, LO=1110, cf=0
Сдвиги через регистр флагов более чем на 1 бит практически не используются.
См. также
Примечания
- ↑ Можно вместо очистки флага для первого обрабатываемого слова использовать арифметический\логический сдвиг, если он присваивает флагу
cf
значение вышедшего бита.
Ссылки
Переворот массива, циклический сдвиг массива на число — Вики-конспекты АК-642
Переворот массива
- перевернуть массив —
- значит поменять местами первый элемент с последним, второй — с предпоследним и тд до середины.
Чтобы осуществить переворот массива можно, например:
- Объявить цикл с шагом 1, начальным значением переменной 0 (for) и условием выхода из него — значение переменной-счетчика больше, чем число элементов в массиве, деленное пополам
- Осуществить перестановку элементов массива (с каждым шагом цикла меняем местами 2 элемента):
- Присвоить значение элемента массива переменной с соответствующим типом (по условию задачи — int)
- Присвоить элементу из первой половины массива с номером, соответствующим шагу цикла, значение симметричного ему элемента из второй половины (например a[i]=a[n-1-i], где а[i] — значение элемента массива, i — переменная-счетчик цикла, n — число элементов массива)
- Присвоить элементу из второй половины массива (в примере — a[n-1-i]) значение переменной
В данном случае не имеет значения, четное количество элементов или нет:
мы используем целочисленное деление (например 9/2 = 4), поэтому если n — четное, то получается какое-то количество пар элементов из первой и второй половины массива, которые мы меняем местами, а если n — нечетное, то оставшийся «одиноким» серединный элемент массива останется нетронутым циклом, так как он в любом случае сохранит при перевороте свою позицию, то есть, номер (будет как бы осью симметрии)
Посмотрим на блок-схему, подробно иллюстрирующую работу описанного алгоритма, если в массиве 10 элементов:
Блок-схема
Реализация алгоритма в виде кода на языке С++:
#include <iostream> using namespace std; const int n=10; int m[n], b=0; int _tmain(int argc, _TCHAR* argv[]) { cout<<endl; cout<<" "; for (int i=0; i<n; i++){ cin>>m[i]; cout<<" ";} for (int j=0; j<n/2; j++){ b=m[j]; m[j]=m[n-j-1]; m[n-j-1]=b;} for (int i=0; i<n; i++){ cout<<m[i]; cout<<" ";} cin. get(); // в visual studio для отображения результата cin.get(); }
Число присваиваний в данном коде равно 3*(n/2), что является оптимальным вариантом.
Циклический сдвиг массива на число
- циклический сдвиг —
- Циклическим сдвигом массива вправо на k позиций называется операция, после которой каждый элемент с номером x становится элементом :с номером x + k, если x+k больше длины массива, отсчёт продолжается с 0
- Пример. Дан массив 1 2 3 4 5 6
- Циклический сдвиг его вправо на 1:
- 6 1 2 3 4 5
- вправо на 4:
- 3 4 5 6 1 2
Для решения этой задачи при сравнительно небольшом количестве элементов в массиве можно использовать следующий алгоритм:
- Объявить цикл с шагом 1: i – счетчик, начальное значение 0, условие выхода из цикла: i>=k (for)
- Присвоить переменной значение первого элемента массива
- Объявить вложенный цикл с шагом 1: j – счетчик, начальное значение 0, условие выхода из цикла: j>=n-1, где n — количество элементов массива. В этом цикле:
- Присвоить элементу с номером, равным счетчику внутреннего цикла значение следующего элемента (a[j] присвоить значение a[j+1])
- После выполнения внутреннего цикла присвоить последнему элементу массива (a[n-1]) значения переменной (то есть, значение первого элемента)
Таким образом, мы сдвигаем массив на одну позицию k раз, получая сдвиг на k позиций.
Блок-схема программы, если n=10, k- количество позиций сдвига:
Блок-схема
Реализация алгоритма в виде кода на языке С++:
#include <iostream> using namespace std; int m[10],k, b; int _tmain(int argc, _TCHAR* argv[]) { for (int i=0; i < 10; i++){ cin>>m[i];} cin >> k; cout << endl; for (int i=0; i<k; i++){ b=m[0]; for (int j=0; j<9; j++){ m[j]=m[j+1];} m[9]=b;} for (int i=0; i<10; i++){ cout<<m[i]<<" ";} cin.get(); // в visual studio для отображения результата cin.get(); }
В программе число присваиваний
равно k*(n+1)
Команды циклического сдвига — Студопедия
Циклический сдвиг представляет собой операцию сдвига, при которой выдвинутый бит занимает освободившийся разряд. Существуют следующие команды циклического сдвига:
ROR ; Циклический сдвиг вправо
ROL ; Циклический сдвиг влево
RCR ; Циклический сдвиг вправо с переносом
RCL ; Циклический сдвиг влево с переносом
Следующая последовательность команд иллюстрирует операцию циклического сдвига ROR:
MOV BX,10110111B ; 10110111
ROR BX,4 ; 01111011 ;Сдвиг вправо на 4
Команда ROR сдвигает все биты вправо и переносит правые единичные биты регистра BX в освободившиеся левые позиции.
В командах RCR и RCL в сдвиге участвует флаг CF. Выдвигаемый из регистра бит заносится в флаг CF, а значение CF при этом поступает в освободившуюся позицию.
Рассмотрим пример, в котором используются команды циклического и простого сдвига. Предположим, что 32-битовое значение находится в регистрах DX:AX так, что левые 16 бит лежат в регистре DX, а правые — в AX. Для умножения на 2 этого значения возможны следующие две команды:
SHL AX,1 ;Умножение пары регистров
RCL DX,1 ; DX:AX на 2
Здесь команда SHL сдвигает все биты регистра AX влево, причем самый левый бит попадает в флаг CF. Затем команда RCL сдвигает все биты регистра DX влево и в освободившийся правый бит заносит значение из флага CF.
Содержание отчета
Для защиты лабораторной работы каждым студентом должен быть написан отчет о лабораторной работе, включающий тему, цель работы и содержащий следующие пункты:
1. Общие сведения о командах перехода.
2. Общие сведения о логических командах и командах сдвига.
3. Ответы на контрольные вопросы 1, 2 и 3-5 (по номеру своего варианта).
4. Листинги двух (трех) программ.
Контрольные вопросы
1. Что такое флаговый регистр? Где он находится? Как к нему получить доступ?
2. Какое максимальное количество байт могут обойти команды короткий JMP, LOOP и относительный переход? Какой машинный код операнда при этом генерируется?
3. На какие флаги воздействуют следующие события и какое значение этих флагов?
1) произошло переполнение;
2) результат отрицательный;
3) результат нулевой;
4) обработка в пошаговом режиме;
5) передача данных должна быть справа налево.
4. Регистр BL содержит 11100011 и регистр AH содержит 01111001. Определите воздействие на регистр BL для следующих команд:
1) xor bl, ah;
2) and bl, ah;
3) or bl, ah;
4) xor bl,11111111b;
5) and bl,00000000b.
5. Регистр DX содержит 10111001 10111001. Определите содержимое регистра DX после следующих несвязанных команд:
1) shr dx,1;
2) shr dx,3;
3) shl dx,2;
4) shl dl,1;
5) ror dx,2;
6) ror dl,3.
Циклические коды
Циклическим кодом
называется такой линейный код, у которого
при любом циклическом сдвиге разрешенного
кодового слова получается другое
разрешенное кодовое слово.
Циклический код
обладает всеми свойствами линейных
кодов. Следовательно, его можно задать
порождающей или проверочной матрицей.
Но циклические коды обладают свойствами,
которые позволяют сильно упростить
процедуры и устройства кодирования и
декодирования.
Представление
кодовых слов степенными полиномами.
Кодовые слова
циклического кода ставят в соответствие
степенным полиномам по следующему
правилу: двоичной последовательности
V
длины n
соответствует
полином (n-1)-й
степени
Здесь х – формальная
переменная.
Циклический сдвиг
кодового слова на i
разрядов влево
соответствует умножению полинома V(x)
на xi
по модулю (xn+1).
Пример.
Пусть n=7.
Задано кодовое слово 1001101
x6+x3+x2+1.
Сдвиг кодового слова на 1 разряд влево
дает другое кодовое слово 0011011
х4+х3+х+1.
V(x)*xi mod (xn+1)=(x6+x3+x2+1)*x mod (x7+1)=(x7+x4+x3+x) mod (x7+1)=
=x4+x3+x+1
A=BmodC
(А равно остатку от деления В на С)
Циклический сдвиг
кодового слова на i
разрядов вправо
соответствует умножению полинома V(x)
на x—i
или хn—i
по модулю (xn+1).
V(x)*x-i mod
(xn+1)=
V(x)*xn-i mod
(xn+1)
Порождающий
полином циклического кода
Множество кодовых
слов циклического кода можно указать,
задав любое ненулевое кодовое слово.
Обычно для задания циклического кода
указывают полином
наименьшей степени g(x)
, который полностью определяет код и
называется порождающим.
Степень порождающего полинома равна
(n-k)
, а свободный член V0
всегда равен 1.
Порождающий полином
используют для определения порождающей
матрицы
циклического кода:
В качестве первой
строки
матрицы записывают g(x),
дополнив комбинацию нулями слева для
получения кодового слова длиной n
символов.Вторая строка –
x*g(x)
(циклический сдвиг первой строки на
одну позицию влево).Третья строка –
x2*g(x)
(циклический сдвиг первой строки на
две позиции влево).
……………………………………………………………………………………..
К-я строка –
xk-1*g(x)
(циклический сдвиг первой строки на
(k-1)
позицию влево).
Пример.
Задан код (7,4) с
порождающим полиномом g(x)=x3+x+1.
Требуется записать его порождающую
матрицу.
Полиномы кодовых
слов циклического кода делятся без
остатка на свой порождающий полином
g(x).
Выбор g(X) для построения циклического кода длины n.
Любой полином,
который является делителем полинома
(xn+1)
можно использовать в качестве порождающего.
С ростом n
число возможных циклических кодов
растет. На практике при построении
циклических кодов пользуются таблицами
разложения полиномов (xn+1)
на неприводимые полиномы. Любой
неприводимый полином, входящий в
разложение, или произведение нескольких
неприводимых полиномов можно выбрать
в качестве порождающего полинома,
который дает соответствующий циклический
код.
Пример.
Требуется определить,
какие циклические коды можно построить
при длине кодового слова n=7.
x7+1=(x+1)(x3+x2+1)(x3+x+1)
Можно построить
следующие ЦК:
(7,6) с g(x)=x+1
(7,1) с g(x)=
(x3+x2+1)(x3+x+1)=x6+x4+x3+x5+x3+x2+x3+x+1=
=x6+x5+x4+x3+x2+x+1
(7,4) c
g(x)= x3+x2+1(7,4) c
g(x)= x3+x+1(7,3) c
g(x)= (x+1)(x3+x2+1)=x4+x3+x+x3+x2+1=x4+x2+x+1(7,3) c
g(x)= (x+1)(x3+x+1)=x4+x2+x+x3+x+1=x4+
x3+x2+1
Процедура
кодирования циклическим кодом
Процедура кодирования
записывается следующим образом:
V(x)=U(x)*xn-k+R(x)
R(x)=
U(x)*xn-k
mod g(x)
В этом случае
первые k
разрядов кодового слова являются
информационными, а последние r=n-k
— проверочными.
Пример
Закодировать
информационную последовательность
U=0110
циклическим кодом (7,4) с порождающим
полиномом g(x)=
x3+x+1.
U(x)= x2+x,
r=n-k=3, U(x)*x3=
x5+x4
R(x)=(
x5+x4)
mod (x3+x+1)
R(x)=1
V=0110001
V(x)=
x5+x4+1
Сложение коэффициентов
при одинаковых степенях осуществляется
по модулю 2.
Деление можно
выполнять в двоичном виде.
U(x)*x3=
x5+x4
0110000
g(x)
1011
R=001V=0110001
Число проверочных
символов равно степени порождающего
полинома.
Задача
Разделимый
циклический код (7,4) задан порождающим
полиномом
g(x)= x3+x2+1.
Соответствуют ли
кодовые слова информационным
последовательностям?
U1=1101
V1=1101000U2=0001
V2=0001110U3=1011
V3=1011100
Процедура
декодирования циклического кода
В основу принципа
декодирования циклического кода положено
свойство делимости кодовых слов без
остатка на порождающий полином.
Декодирование
с обнаружением ошибок
Если принятая
комбинация Y(x)
делится без остатка на g(x),
то считается, что ошибок нет или произошла
не обнаруживаемая кодом ошибка. В случае
обнаруженной ошибки имеет место ненулевой
остаток от деления, который называется
синдромом.
S(x)=Y(x)
mod g(x)=e(x) mod g(x)
Здесь e(x)
– полином ошибки.
Деление на
порождающий полином можно заменить
умножением на проверочный полином h(x)
по модулю (xn+1).
Результат в случае отсутствия ошибок
должен быть равен нулю.
[Y(x)*h(x)]
mod
(xn+1)=0
Декодирование
с исправлением ошибок
Обычно в памяти
декодера заданного циклического кода
хранится некоторый типовой
вектор
ошибки
и соответствующий ему типовой
синдром.
Пусть ошибке вида
e0
соответствует синдром S0.
Назовем их типовыми.
S0(x)=e0(x)
mod
g(x)
Если вектор ошибки
e’
получается из e0
путем i
циклических сдвигов, то есть
e'(x)=e0
(x)*xi
mod (xn+1),
то синдром ошибки
e’
будет равен
S'(x)=S0(x)*xi
mod g(x),
а S0(x)=
S'(x)* x-i
mod g(x)
Пример
Пусть для передачи
сообщений используется циклический
код (7,4) с порождающим полиномом g(x)=
x3+x2+1.
Декодер работает в режиме исправления
одиночных ошибок.
При использовании
ДСК без памяти таблица декодирования
имеет вид
Вектор | Синдром |
0000001 | 001 |
0000010 ………….. | 010 ……. |
1000000 | 110 |
В качестве типовых
обычно выбирают e0=0000001
и S0=001.
Предположим при
декодировании получен синдром S‘=100.
Требуется найти имеющий место вектор
ошибки и исправить кодовое слово.
S0(x)=S'(x)*x-i
mod g(x)
Если i=1,
S1=
x2*
x-1
mod
g(x)=x,
не совпадает с типовым синдромом.
Если i=2,
S2=x2*x-2
mod
g(x)=1,
совпадает с типовым синдромом.
Искомый вектор
ошибки получается циклической
перестановкой типового вектора e0
на i=2
разряда влево.
e’=0000100
Лекция 10
КОДИРУЮЩИЕ И
ДЕКОДИРУЮЩИЕ УСТРОЙСТВА ЦИКЛИЧЕСКИХ
КОДОВ
Основой кодера
циклического кода является регистр
сдвига (РС) с логическими обратными
связями и сумматорами по модулю 2. Число
ячеек памяти регистра равно r=n-k,
число сумматоров по модулю 2 на единицу
меньше числа ненулевых членов g(x).
Место включения сумматоров определяется
структурой (ненулевыми коэффициентами)
порождающего полинома g(x).
Схема кодирующего
устройства в общем виде
Нижеприведенная
схема делит входную последовательность
на полином
g(x)=grxr+gr-1xr-1+….+g1x+g0
Вх
1
Вых
0
1
2
r-1
g0
g1
g2
gr-1
2
Ключ
Например, для кода
с порождающим полиномом g(x)=x3+x2+1
получаем g0=1,
g1=0,
g2=1.
Получаем схему:
1
Вх
0
1
2
Вых
g0
g2
2
Ключ
В исходном состоянии
Ключ находится в положении 1. Символы
информационной последовательности,
начиная со старшего разряда, поступают
на вход схемы деления через входной
сумматор и ключ (1) и одновременно через
схему ИЛИ (1) на выход кодера. Через k
тактов в регистре сдвига образуются
проверочные символы, ключ переводится
в положение (2) и проверочные символы
поступают через схему ИЛИ на выход.
Таким образом через n
тактов на выходе формируется кодовое
слово циклического кода.
Рассмотрим, как
меняется состояние схемы на каждом
такте работы кодера.
№ | Инф.символ | Символ | Положение | Символ | ||||
0 | 1 | 2 | ||||||
1 | 1 | 1 | 0 | 1 | 1 | 1 | ||
2 | 0 | 1 | 1 | 1 | 1 | 0 | ||
3 | 0 | 1 | 1 | 0 | 1 | 0 | ||
4 | 0 | 0 | 1 | 1 | 1 | 0 | ||
5 | 0 | 0 | 0 | 1 | 2 | 1 | ||
6 | 0 | 0 | 0 | 0 | 2 | 1 | ||
7 | 0 | 0 | 0 | 0 | 2 | 0 |
Используется
2-тактная работа схемы:
T’ –
считывание
состояния
T'<T»
T» –
запись
Проверим, правильно
ли сформированы проверочные символы:
10000000 |1101
1101
1010
1101
1110
1101
110
– проверочные символы найдены верно
Декодер
циклического кода
Декодер циклического
кода должен вычислять синдром и состоит
из запоминающего регистра с числом
ячеек памяти равным n
и схемы деления на g(x).
Кроме того, декодер содержит схемы
дешифратора ошибки и устройства
исправления либо стирания принятой
кодовой комбинации.
Рассмотрим схему
декодера циклического кода (7,4) с
порождающим полиномом g(x)=x3+x2+1.
Запоминающий
регистр
Вх
0
1
2
3
4
5
6
0
1
2
Вых
УИс
УСт
Схема
деления на g(x)
Дешифратор
ошибки
Рассмотрим два
случая:
Поступающее на
вход декодера кодовое слово не
содержит
ошибок.
На вход поступает
последовательность 1000110.
№ такта | Символ | Символ | ||
0 | 1 | 2 | ||
1 | 1 | 1 | 0 | 0 |
2 | 0 | 0 | 1 | 0 |
3 | 0 | 0 | 0 | 1 |
4 | 0 | 1 | 0 | 1 |
5 | 1 | 0 | 1 | 1 |
6 | 1 | 0 | 0 | 0 |
7 | 0 | 0 | 0 | 0 |
S=(000),
ошибки в принятой последовательности
не обнаружены. Деление закончено. Кодовое
слово последовательно поступает из
запоминающего регистра на выход декодера.
Поступающая
последовательность содержит
ошибку
e(x)=x3
0001000,
следовательно на вход поступает
комбинация 1001110.
№ такта | Символ | Символ | ||
0 | 1 | 2 | ||
1 | 1 | 1 | 0 | 0 |
2 | 0 | 0 | 1 | 0 |
3 | 0 | 0 | 0 | 1 |
4 | 1 | 0 | 0 | 1 |
5 | 1 | 0 | 0 | 1 |
6 | 1 | 0 | 0 | 1 |
7 | 0 | 1 | 0 | 1 |
8 | 0 | 1 | 1 | 1 |
9 | 0 | 1 | 1 | 0 |
10 | 0 | 0 | 1 | 1 |
11 | 0 | 1 | 0 | 0 |
На 7-м такте в
ячейках схемы деления сформирован
синдром S’,
не совпадающий с S0
и не равный нулю.
Если декодер
работает с обнаружением
ошибок,
дешифратор ошибки выдает в устройство
стирания сигнал, запрещающий появление
на выходе кодового слова.
Если декодер
работает с исправлением
ошибок,
процесс деления продолжается до тех
пор, пока в ячейках схемы деления не
образуется синдром S0=001.
В данном случае деление продолжается
в течение 8 – 11 тактов. Начиная с 8-го
такта на выходе декодера появляются
символы кодового слова, начиная со
старшего разряда (коэффициент при х6).
На 11 – м такте в ячейках схемы деления
образуется типовой синдром S0.
Дешифратор ошибки формирует сигнал,
изменяющий на выходе текущий символ
кодового слова (коэффициент при х3).
Деление закончено. Ошибка исправлена.
Лекция 11
Битовый сдвиг — Википедия
Би́товый сдвиг — изменение позиций бит в машинном слове.
Большинство компьютеров не могут напрямую адресовать биты, которые содержатся группами по 8, 16, 32 или 64 бита в машинном слове. Для обеспечения работы с битами существует множество машинных инструкций, включающие различные типы сдвигов. Все сдвиги похожи друг на друга поведением средних битов, которые просто сдвигаются влево или вправо на определённую величину. Однако, поведение крайних битов, которые уходят из слова и которые появляются в слове, зависит от типа сдвига.
В электронике битовые сдвиги выполняются на сдвиговых регистрах.
Логический сдвиг
Логический сдвиг влево | Логический сдвиг вправо |
Сдвиг, при котором уходящий бит исчезает, не влияя на оставшиеся биты, а на месте появившегося бита записывается бит 0.
Пример работы операции сдвига:
- Пусть у нас есть число 10101010b (в двоичной системе).
- Если сделать сдвиг влево на 1 бит, то получим число 01010100b.
- Если сделать сдвиг исходного числа вправо на 1 бит, то получим число 01010101b.
В большинстве процессоров уходящий бит сохраняется во флаге переноса. Эта функция широко используется при работе со многобайтовыми числами.
Арифметический сдвиг
Арифметический сдвиг влево | Арифметический сдвиг вправо |
При этом сдвиге слово рассматривается не просто как группа битов, а как целое число в дополнительном коде.
При сдвиге влево ведёт себя как логический сдвиг, при сдвиге вправо уходящий бит исчезает, не влияя на оставшиеся биты, а на месте появившегося бита устанавливается бит, соответствующий знаку.
Пример №1
Пример работы операции сдвига 8 битного числа в прямом коде:
- Пусть у нас есть 8 битное число: 0000 0010b = 2. (записанное в двоичной системе, в прямом коде).
- Cдвиг влево на 1 бит, дает число: 00000100b = 4.
- Сдвиг вправо на 1 бит, дает число: 00000001b = 1.
Пример №2
Пример работы операции сдвига 8 битного числа записанного в дополнительном до 2х коде:
- Пусть у нас есть число 11111010b = −6 (в двоичной системе, в дополнительном коде).
- Если сделать сдвиг влево на 1 бит, то получим число 11110100b = −12.
- Если сделать сдвиг исходного числа вправо на 1 бит, то получим число 11111101b = −3.
Вывод
Легко заметить, что при арифметическом сдвиге сдвиг влево соответствует умножению на 2, а сдвиг вправо — делению на 2 (в общем случае — на основание системы счисления) с округлением к −∞. Например:
1011 = −5 1111 = −1 >>a 1 >>a 1 ---- ---- 1101 = −3 1111 = −1
Схемотехническая реализация операций сдвига очень проста. Именно поэтому эти операции рекомендуют использовать для операций умножения и деления целых чисел на числа, равные степени 2 (2, 4, 8, 16, 32, 64 и т. д.) — если, конечно, такое округление отрицательных чисел не мешает.
Циклический сдвиг
Циклический сдвиг влево | Циклический сдвиг вправо |
При этом сдвиге уходящий бит появляется на месте появившегося свободного на другом конце числа.
Пример
- Пусть у нас есть число 11111010b (в двоичной системе).
- Если сделать сдвиг влево на 1 бит, то получим число 11110101b.
- Если сделать сдвиг вправо на 1 бит, то получим число 11111010b.
Циклический сдвиг через бит переноса
Циклический сдвиг влево через бит переноса | Циклический сдвиг вправо через бит переноса |
В архитектуру многих процессоров входит флаг переноса в следующий разряд (например, cf
на x86). Данная операция выполняет циклический сдвиг над (n+1)-битным числом, состоящим из регистра и флага переноса.
Например, если у нас в регистре число 11111010b, флаг переноса циклического сдвига вправо равен 0.
- После сдвига влево на 1 бит в регистре 11110101b, флаг переноса равен 1.
- После сдвига вправо на 1 бит в регистре 01111101b, флаг переноса равен 1.
Операция циклического сдвига через бит переноса используется при работе с многобайтовыми числами. В частности, чтобы сдвинуть вправо на 1 бит длинное число, нужно очистить[1]cf
(в случае деления числа со знаком нужно записать в cf
старший бит старшего слова) и циклически сдвинуть на единицу через cf
каждое слово, начиная с верхнего. Например, пусть у нас есть число 011000111100b, занимающее три 4-битных слова:
Было: HI=0110, MED=0011, LO=1100, cf=0 После сдвига HI: HI=0011, MED=0011, LO=1100, cf=0 После сдвига MED: HI=0011, MED=0001, LO=1100, cf=1 После сдвига LO: HI=0011, MED=0001, LO=1110, cf=0
Сдвиги через регистр флагов более чем на 1 бит практически не используются.
См. также
Примечания
- ↑ Можно вместо очистки флага для первого обрабатываемого слова использовать арифметический\логический сдвиг, если он присваивает флагу
cf
значение вышедшего бита.
Ссылки
Циклические смены | Основы работы с битами и основные практические проблемы программирования
Циклические смены
Вам дается число \ (N \) , представленное как двоичное представление \ (X = 16 \) бит. Вам также дается число \ (m \) и символ \ (c \ (L \ или \ R) \) .
Определите число \ (M \), которое генерируется после циклического сдвига двоичного представления \ (N \) на \ (m \) позиций либо влево, если \ (c = L \), либо вправо \ ( с = R \).
Формат ввода
- Первая строка содержит целое число \ (T \), обозначающее количество запросов.
- Следующие строки \ (T \) содержат \ (N \ m \ c \), как указано в формулировке задачи.
Формат вывода
Выведите целые числа \ (T \) в отдельной строке, представляя ответ на каждый запрос.
Ограничения
\ (1 \ le T \ le 1e4 \\
1 \ ле н \ ле 65535 \\
1 \ ле м \ ле 15 \)
Объяснение
Для первого случая: N в двоичном формате равно 0001 1110 1100 1001 и сдвигая его влево на 5 позиций, он становится 1101 1001 0010 0011, который в десятичной системе равен 55587
Для второго случая: N в двоичном формате равно 0001 1110 1100 1001 и сдвигается на 3 положение вправо становится 0010 0011 1101 1001, что в десятичной системе составляет 9177
Лимит времени:
1.0 сек (с)
для каждого входного файла.
Ограничение памяти:
256 МБ
Ограничение источника:
1024 КБ
Циклический сдвиг | Статья о циклическом сдвиге от The Free Dictionary
В [16] предлагается простой метод SLM, основанный на циклическом сдвиге последовательности во временной области и комбинации антенн.(3) Циклический сдвиг начальной последовательности фаз [математическое выражение не воспроизводится] представляет собой циклический сдвиг S на [d.sub.pn]. Замещение, циклический сдвиг и транспонирование фаз функционируют как путаница и диффузия. Вход: исходный речевой сигнал Я и матрицы хаотических серий B и C Выход: столбцы и строки перетасованы речевой блок T (1) Сгенерировать матрицы сдвига столбцов и строк путем сортировки [x.sub.k] и [y.sub.k] хаотической последовательности (2) для я = 1 до N делать (3) если mod ([b.sub.i], 2) = 0, то циклический сдвиг речевого сегмента в столбце я из I вниз с размером шага b.sub.i]; (4) иначе Циклический сдвиг сегмента речи в столбце я I до с размером шага [b.sub.i]; (5) конец, если (6) конец для (7) Обозначьте речевой блок со сдвигом столбца как T. В схеме, представленной в [11], циклический SLM во временной области с отложенной корреляцией (DC) применяется для уменьшения PAPR и оценить количество циклического сдвига в приемнике без передачи SI. Свойство замкнутости семейства контекстно-свободных языков при операции циклического сдвига. Таким образом, существует m-кортеж ([l.sub.1], [l.sub.2], * * *, [l.sub.m]), что циклический сдвиг массива ошибки ([e.sub.1] (x), * * *, [e. sub.m] (x)) через ([l.sub.1], [l.sub.2], * * *, [l.sub.m]) позиций (или, что то же самое, циклический сдвиг ошибки [e. sub.i] (x) до li позиций (1 [меньше или равно] i [меньше или равно] m) в классическом смысле) имеет все ненулевые компоненты, ограниченные первыми r столбцами e (обратите внимание, что мы идентификация e (x) [стрелка влево и вправо] e под картой [theta]). В предлагаемой схеме существует компромисс между типом А шаблона фиктивной последовательности и временем итерации для циклического сдвига.Таким образом, учет этих элементов является важным аспектом снижения PAPR и подходящей сложности системы. Алгоритм генерации S-CHS разделен на три части: построение таблицы Кэли, отражение, циклический сдвиг и цепочку. Фазовый код INS MCPC. Последовательность импульсов представляет собой циклический сдвиг кода P4. На рисунке 4 показана функция неоднозначности INS MCPC на основе кода P4. Отметим, что небольшая модификация конструкции Рубинштейна (пример 2.15) дает булеву функцию, инвариантную относительно циклического сдвига переменных, которая все еще показывает квадратичный разрыв между чувствительностью и блокировка чувствительности.Другими словами, когда расстояние циклического сдвига между двумя пользователями больше, чем максимальный разброс задержки многолучевого канала с замираниями L, между ними не будет никакого MAI.
Циклический код
. — скачать ppt
Презентация на тему: «Циклический код». — Расшифровка презентации:
1
Циклический код
2
Линейный блочный код Код Хэмминга — это линейный блочный код.Линейный блочный код означает, что кодовое слово генерируется путем умножения вектора сообщения на матрицу генератора. Минимальный вес максимально большой. Если минимальный вес равен 2t + 1, он способен обнаруживать 2t битов ошибок и исправлять t битов ошибок.
3
Циклические коды. Код Хэмминга полезен, но существуют коды, которые предлагают такие же (если не большие) возможности контроля ошибок, но могут быть реализованы намного проще.Циклический код — это линейный код, в котором любой циклический сдвиг кодового слова остается кодовым словом. Делает кодирование / декодирование намного проще, не требует умножения матриц.
4
Циклический код Полиномиальное представление циклических кодов.
C (x) = Cn-1xn-1 + Cn-2xn-2 +… + C1x1 + C0x0, где в этом курсе коэффициенты принадлежат двоичному полю {0,1}. То есть, если кодовое слово () (сначала c6, затем c0), мы записываем его как x6 + x4 + x + 1.Сложение и вычитание полиномов — выполняется путем двоичного сложения или вычитания для каждого бита индивидуально, без переноса и без заимствования. Деление и умножение многочленов. Попробуйте разделить x3 + x2 + x + 1 на x + 1.
5
Циклический код Циклический код (n, k) может быть сгенерирован полиномом g (x), который имеет степень n-k и множитель xn — 1. Назовите его порождающим полиномом. Для заданных битов сообщения (mk-1… m1m0) код генерируется просто как: Другими словами, C (x) можно рассматривать как произведение m (x) и g (x).
6
Пример циклического кода (7,4) с g (x) = x3 + x + 1.
Если m (x) = x3 + 1, C (x) = x6 + x4 + x + 1.
7
Обнаружение ошибок с помощью циклического кода
Циклический код (7,4) с g (x) = x3 + x + 1. Если полученный многочлен равен x6 + x5 + x2 + 1, есть ли ошибки? Или это кодовый полином?
8
Обнаружение ошибок с помощью циклического кода
Циклический код (7,4) с g (x) = x3 + x + 1.Если полученный полином равен x6 + x5 + x2 + 1, есть ли ошибки? Мы делим x6 + x5 + x2 + 1 на x3 + x + 1, а остаток равен x. Дело в том, что остаток не равен 0. Таким образом, это не кодовый полином, поэтому возникают ошибки.
9
Циклический код, используемый в IEEE 802
g (x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 все одинарные и двойные битовые ошибки все ошибки с нечетным числом битов все пакетные ошибки длиной 32 или меньше
10
Схема деления Вы, вероятно, спросите, что мы также можем обнаруживать ошибки с помощью кода Хэмминга.