|
#1
|
|||
|
|||
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
|
||||
|
||||
Вообще-то нужно ещё одно значение для даной операции - это количество бит, на которое нужно спестить.
Или это у тебя какие-то самописные ф-ии в которых задано константное значение сдвига, т.к. такого вызова как у тебя я нигде не встречал. В твоем кажется: Код:
val := val shl 8; Меня греют ваши плюсы к моей репутации... Последний раз редактировалось BoRoV, 11.01.2011 в 22:33. |
#3
|
|||
|
|||
Да, ты верно понял. В моем случае это именно так.
Ф-ия Shl и Shr нигде в проге не объявлены. Поэтому я и не понимаю принципа работы данных ф-ий... |
#4
|
||||
|
||||
shl осуществляет сдвиг влево целого числа и его не где не надо объявлять.
Код:
procedure TForm1.Button1Click(Sender: TObject); var x: Integer; begin x := $5ABC; x := x shl 1; ShowMessage(IntToStr(x)); end; Помогаю за Спасибо |
#5
|
||||
|
||||
Например 4 shr 1 дадут 2, т.е. идет деление на 2 причем в отличии от обычного деления / результат уже будет целочисленным и выполняется эта операция существенно быстрее.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
То что эти функции смещают биты, я понял.
Для меня не понятно по какому принципу они добавляют биты Пример 3: 56841027 Shl 8 = 1666401024 56841027 11011000110101001101000011 1666401024 1100011010100110100001100000000 В этом примере происходит и смещение и добавление |
#7
|
||||
|
||||
Верно. Каждый бит исходного числа перемещается влево на 8 позиций. Образвавшиеся 8 свободных бит заполняются нулями.
Вы несколько неверно представили число в двоичном виде.Вот что там на самом деле в начале: 00000011011000110101001101000011 а вот что стало после: 11011000110101001101000011000000 т.е. 32 бита было и осталось, вот только содержимое уехало влево Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#8
|
|||
|
|||
Нет. число 56841027 верно представлено в двоичном формате
11011000110101001101000011. Проверьте. и результат тоже верный. Вопрос только почему добавляются биты... Это не единственный пример с добавлением. например: 15 Shl 8 = 3840 15 Shl 2 = 60 15 = 1111 3840 = 111100000000 60 = 111100 Просто не понимаю! |
#9
|
|||
|
|||
Нет. число 56841027 верно представлено в двоичном формате
11011000110101001101000011. Проверьте. и результат тоже верный. Вопрос только почему добавляются биты... Это не единственный пример с добавлением. например: 15 Shl 8 = 3840 15 Shl 2 = 60 15 = 1111 3840 = 111100000000 60 = 111100 Просто не понимаю! |
#10
|
|||
|
|||
Если все операции проводятся с типом 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 Аналогично и для других |