Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2010, 11:48   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию Битовые операции

Что такое двоичный сдвиг и вообще зачем он нужен?
_-Re@l-_ вне форума Ответить с цитированием
Старый 11.07.2010, 12:56   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,218
По умолчанию

Цитата:
Сообщение от _-Re@l-_
Что такое двоичный сдвиг
Сдвиг битов числа.
Цитата:
Сообщение от _-Re@l-_
вообще зачем он нужен?
Нужен для сдвига битов числа
Arigato вне форума Ответить с цитированием
Старый 11.07.2010, 13:06   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

А можно поконкретнее...
_-Re@l-_ вне форума Ответить с цитированием
Старый 11.07.2010, 13:09   #4
Rapid
Форумчанин
 
Аватар для Rapid
 
Регистрация: 01.09.2007
Сообщений: 747
По умолчанию

Сдвиги нужны для выполнения элементарных операций. Для умножения.
Никому не верьте.
Rapid вне форума Ответить с цитированием
Старый 11.07.2010, 13:12   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

2 в двоичной системе = 10
2 >> 1 означает сдвинуть 1 бит вправо
2 >> 1 = 100 = 4
по сути сдвиг вправо это быстрое умножение на степень двойки
2 >> 1 = 2*2^1 = 4
2 >> 2 = 1000 = 2*2^2 = 8

Аналогично сдвиг влево:
2 = 10
2 << 1 сдвинуть 1 бит влево, т.е будет 1
сдвиг влево это деление на степень двойки
2 << 1 = 2/(2^1) = 1
8 << 2 = 8/(2^2) = 8/4 = 2
NiCola999 вне форума Ответить с цитированием
Старый 11.07.2010, 13:21   #6
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,033
По умолчанию

Например для операции с одним битом, вот пример:
Код:
        in R16 , PINB
	mov r18 , R16
	mov r19 , R16	

	ldi buf , 0x02

	and R16 , buf

	eor R16 , buf

	ldi buf , 0xFD

	and r19 , buf
	
	or R16 , r19

	out PORTB , R16

	reti
Здесь мы можем увидеть инвертирование второго бита в байте.
Кто знает более легкий способ- пишите

Блин, я забыл что упростил и убрал сдвиг >_<

Ладно, можно, например, сделать гирлянду бегущие огни(используя один порт микроконтроллера) с помощью сдвига битов на каждой итерации главного цикла(ну или в прерываниях, ессно).
Код:
MAIN:
	ldi temp , 0b01001011    // Инициализация порта  загрузка константы в регистр
	out PORTB , temp         // Инициализация порта выгрузка из регистра в порт

A1:
	in temp , PORTB           // Загрузка состояния порта в регистр
	ror temp                     // Циклический сдвиг регистра ( Rotate Right Through Carry)
	out PORTB , temp        // Выгрузка регистра в порт
rjmp A1

Последний раз редактировалось Levsha100; 11.07.2010 в 13:46.
Levsha100 вне форума Ответить с цитированием
Старый 11.07.2010, 13:33   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,218
По умолчанию

Цитата:
Сообщение от Levsha100
Здесь мы можем увидеть инвертирование второго бита в байте.
Кто знает более легкий способ- пишите
А просто xor al, 2 не пойдет разве?
Или xor al, 4, если номера битов от 0 считать.
Arigato вне форума Ответить с цитированием
Старый 11.07.2010, 13:34   #8
Indian
Форумчанин
 
Регистрация: 23.02.2010
Сообщений: 107
По умолчанию

Сдвиг редко используется в одиночку, т.к. для чисел это умножение/деление на 2/4/8/16/.. .

Совместно с AND, можно извлекать нужные биты из числа.
Пример:
int alpha=1111001011111111;
int beta = alpha>>9 & 1111b;
В результате, beta=1001b.

А используя OR, компоновать числа.
int a=11001100b;
int b=01101011b;
int c=a<<8 | b;
//с=1100110001101011;

Последний раз редактировалось Indian; 11.07.2010 в 16:28.
Indian вне форума Ответить с цитированием
Старый 11.07.2010, 13:38   #9
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
2 в двоичной системе = 10
2 >> 1 означает сдвинуть 1 бит вправо
2 >> 1 = 100 = 4
по сути сдвиг вправо это быстрое умножение на степень двойки
2 >> 1 = 2*2^1 = 4
2 >> 2 = 1000 = 2*2^2 = 8

Аналогично сдвиг влево:
2 = 10
2 << 1 сдвинуть 1 бит влево, т.е будет 1
сдвиг влево это деление на степень двойки
2 << 1 = 2/(2^1) = 1
8 << 2 = 8/(2^2) = 8/4 = 2
Ну, я написал так:
Код:
var
    a:integer;
begin
       a:=2;
       a:=a shr 1;
       write(a);// выдало 1
       a:=2;
       a:=a shl 1;
       write(a);//выдало 4
       readln;
end.
Так и должно быть?
Цитата:
Например для операции с одним битом, вот пример:
Код:

in R16 , PINB
mov r18 , R16
mov r19 , R16

ldi buf , 0x02

and R16 , buf

eor R16 , buf

ldi buf , 0xFD

and r19 , buf

or R16 , r19

out PORTB , R16

reti
Вы уж простите, но я ассемблер знаю на уровне mov и add......А, ещё push знаю

Последний раз редактировалось _-Re@l-_; 11.07.2010 в 13:41.
_-Re@l-_ вне форума Ответить с цитированием
Старый 11.07.2010, 13:52   #10
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,033
По умолчанию

Вспомнил как это писалось, дело в том что изначально я не мог найти команду xor в даташите, начал ваять и уже когда была построена махина я ВНЕЗАПНО обнаружил что в место xor там команда eor =)
Код:
var
    a:integer;
begin
       a:=2;  //00000010
       a:=a shr 1; //00000010 > 00000001 
       write(a);// выдало 1(00000001)

       a:=2;//00000010 
       a:=a shl 1;//00000010 < 00000100 
       write(a);//выдало 4(00000100)
       readln;
end.

Последний раз редактировалось Levsha100; 11.07.2010 в 14:05.
Levsha100 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Битовые операции(С) Александр Елис Помощь студентам 11 16.02.2010 21:11
Битовые операции ("")(Э_Є)("") Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 04.07.2009 13:19
Битовые операции ("")(Э_Є)("") Общие вопросы C/C++ 4 03.07.2009 19:15
Битовые операции DrAlexx2121 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 14.06.2008 22:26
Битовые операции LEX.darnica Помощь студентам 14 23.12.2007 19:40