Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


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

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

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

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

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

icq: 458-666-144
По умолчанию

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
Влюбленный в С++
Профессионал
 
Аватар для Levsha100
 
Регистрация: 20.07.2008
Адрес: город, которого нет.
Сообщений: 4,036
Репутация: 1376

icq: 590368735
По умолчанию

Например для операции с одним битом, вот пример:
Код:

        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

__________________
Смотри в корень!
use linux - be happy

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

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

Сдвиг редко используется в одиночку, т.к. для чисел это умножение/деление на 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
Репутация: 420
По умолчанию

Цитата:
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
Влюбленный в С++
Профессионал
 
Аватар для Levsha100
 
Регистрация: 20.07.2008
Адрес: город, которого нет.
Сообщений: 4,036
Репутация: 1376

icq: 590368735
По умолчанию

Вспомнил как это писалось, дело в том что изначально я не мог найти команду 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.

__________________
Смотри в корень!
use linux - be happy

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


08:19.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru