Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.01.2011, 22:12
darkfox darkfox вне форума
Прохожий
 
Регистрация: 07.01.2011
Сообщения: 7
Репутация: 10
Вопрос Shl(x) Shr(x)

Народ, всем привет!
Кто знает объясните, пожалуйста, кто знает принцип работы функций Shl и Shr.
Примеры:
1)
909456435 Shl 8 = 892613376
909456435
110110001101010011010000110011

892613376
110101001101000011001100000000

2)
454728217 Shl 8 = 446306560
454728217
11011000110101001101000011001

446306560
11010100110100001100100000000

3)
56841027 Shl 8 = 1666401024
56841027
11011000110101001101000011

1666401024
1100011010100110100001100000000


Эти функции смещаю биты и добавляют их.
По какому принципу это происходит?

Последний раз редактировалось darkfox, 12.01.2011 в 18:18.
Ответить с цитированием
  #2  
Старый 11.01.2011, 22:22
Аватар для BoRoV
BoRoV BoRoV вне форума
Начинающий
 
Регистрация: 08.09.2008
Сообщения: 193
Репутация: 12694
По умолчанию

Вообще-то нужно ещё одно значение для даной операции - это количество бит, на которое нужно спестить.

Или это у тебя какие-то самописные ф-ии в которых задано константное значение сдвига, т.к. такого вызова как у тебя я нигде не встречал.

В твоем кажется:
Код:
val := val shl 8;
__________________
Меня греют ваши плюсы к моей репутации...

Последний раз редактировалось BoRoV, 11.01.2011 в 22:33.
Ответить с цитированием
  #3  
Старый 11.01.2011, 23:39
darkfox darkfox вне форума
Прохожий
 
Регистрация: 07.01.2011
Сообщения: 7
Репутация: 10
По умолчанию

Да, ты верно понял. В моем случае это именно так.
Ф-ия Shl и Shr нигде в проге не объявлены.
Поэтому я и не понимаю принципа работы данных ф-ий...
Ответить с цитированием
  #4  
Старый 11.01.2011, 23:51
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

shl осуществляет сдвиг влево целого числа и его не где не надо объявлять.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  x: Integer;
begin
  x := $5ABC;
  x := x shl 1;
  ShowMessage(IntToStr(x));
end;
__________________
Помогаю за Спасибо
Ответить с цитированием
  #5  
Старый 12.01.2011, 08:05
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Например 4 shr 1 дадут 2, т.е. идет деление на 2 причем в отличии от обычного деления / результат уже будет целочисленным и выполняется эта операция существенно быстрее.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 12.01.2011, 18:17
darkfox darkfox вне форума
Прохожий
 
Регистрация: 07.01.2011
Сообщения: 7
Репутация: 10
По умолчанию

То что эти функции смещают биты, я понял.
Для меня не понятно по какому принципу они добавляют биты

Пример 3:

56841027 Shl 8 = 1666401024
56841027
11011000110101001101000011

1666401024
1100011010100110100001100000000

В этом примере происходит и смещение и добавление
Ответить с цитированием
  #7  
Старый 12.01.2011, 20:02
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Верно. Каждый бит исходного числа перемещается влево на 8 позиций. Образвавшиеся 8 свободных бит заполняются нулями.
Вы несколько неверно представили число в двоичном виде.Вот что там на самом деле в начале:
00000011011000110101001101000011
а вот что стало после:
11011000110101001101000011000000
т.е. 32 бита было и осталось, вот только содержимое уехало влево
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 12.01.2011, 23:57
darkfox darkfox вне форума
Прохожий
 
Регистрация: 07.01.2011
Сообщения: 7
Репутация: 10
По умолчанию

Нет. число 56841027 верно представлено в двоичном формате
11011000110101001101000011. Проверьте.
и результат тоже верный. Вопрос только почему добавляются биты...
Это не единственный пример с добавлением.
например:
15 Shl 8 = 3840
15 Shl 2 = 60
15 = 1111
3840 = 111100000000
60 = 111100

Просто не понимаю!
Ответить с цитированием
  #9  
Старый 12.01.2011, 23:58
darkfox darkfox вне форума
Прохожий
 
Регистрация: 07.01.2011
Сообщения: 7
Репутация: 10
По умолчанию

Нет. число 56841027 верно представлено в двоичном формате
11011000110101001101000011. Проверьте.
и результат тоже верный. Вопрос только почему добавляются биты...
Это не единственный пример с добавлением.
например:
15 Shl 8 = 3840
15 Shl 2 = 60
15 = 1111
3840 = 111100000000
60 = 111100

Просто не понимаю!
Ответить с цитированием
  #10  
Старый 13.01.2011, 00:25
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Если все операции проводятся с типом Integer
Integer: занимает в памяти 4 байта = 4*8 = 32 бита
То есть число 15 будет записано как
15 = 00000000 00000000 00000000 00001111b
Тогда операция shl n (shift left) сдвинет его на n бит влево и добавит на пустое место нули
15 shl 8 = 00000000 00000000 00001111 00000000b = 3840

Аналогично и для других
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter