forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Shl, Shr, Sar (http://forum.boolean.name/showthread.php?t=5096)

IGR 22.11.2007 15:00

Shl, Shr, Sar
 
что делают ети команды ??
насколько мне известно это что то типа для работы с битами (сдвигов в ЛЕВО/ПРАВО) !!
я точно незнаю !!
обясните плиз как ними пользоватся !!

PS: help читал... ...плохо !!

dimanche13 22.11.2007 15:36

Re: Shl, Shr, Sar
 
temp shr n - сдвиг битов вправо, то же самое что temp / (2^n)
temp shl n - сдвиг битов влево, то же самое что temp * (2^n)

применяется только к целым положительным числам.
например: есть ширина экрана 640 высота 480
scrwidth = 640
scrheight = 480
тогда центр экрана
halfwidth = scrwidth shr 1 ; scrwidth / (2^1)
halfheight = scrheight shr 1 ; scrheight / (2^1)

impersonalis 22.11.2007 15:37

Re: Shl, Shr, Sar
 
x=123
DebugLog(Bin(x))
DebugLog(Bin(x Shl 1))
DebugLog(Bin(x Shr 1))

IGR 22.11.2007 15:55

Re: Shl, Shr, Sar
 
ага shr - умножаем , shl - делим !!

а что означает:
value = temp shl 2 And $FFFFFF

Цитата:

x=123
DebugLog(Bin(x))
DebugLog(Bin(x Shl 1))
DebugLog(Bin(x Shr 1))
to imper: что это ??

dimanche13 22.11.2007 16:18

Re: Shl, Shr, Sar
 
Импер имел ввиду вот что: двоичное представление x это bin(x), посмотри, int это 4 байта или 32 бита. shr & shl & and & or & xor - это операции над битами! И поэтому инт-ы лучше созерцать в таком виде, чтобы понять что делают эти команды.

newman 22.11.2007 16:43

Re: Shl, Shr, Sar
 
Shl - двигает число в лево.Это более быстрый метод умножения числа экспоненциально.
Shr - наоборот.двигает число в право.Это быстрый метод деления.
Sar - производит двоичный сдвиг в право.Отличается от Shl тем что заполняет пустые биты.Полезность этой команды заключается в более быстром математическом выполнении расчетов.

alcoSHoLiK 22.11.2007 16:49

Re: Shl, Shr, Sar
 
Цитата:

Сообщение от dimanche13
применяется только к целым положительным числам.

Неправда. Любые числа в комьютере представлены последовательностью битов. Просто с целыми положительными легче предсказать результат операции)

IGR
http://ru.wikipedia.org/wiki/%D0%91%...86%D0%B8%D0%B8

dimanche13 22.11.2007 16:58

Re: Shl, Shr, Sar
 
alcoSHoLiK, я в курсе что "любые числа в комьютере представлены последовательностью битов". А отрицательные числа в обратном коде, где старший разряд определяет знак, значит сдвигать нельзя. То есть можно, но результат будет неправильным.

alcoSHoLiK 22.11.2007 17:14

Re: Shl, Shr, Sar
 
В дополнительном.
Сдвигать можно и даже нужно. Выше было сказано про Sar, она как раз и сохраняет знаковый бит на его месте.

dimanche13 22.11.2007 17:17

Re: Shl, Shr, Sar
 
Цитата:

Сообщение от alcoSHoLiK
Sar, она как раз и сохраняет знаковый бит на его месте.

а я разве про это не сказал? Блин, забыл :-D
ЗЫ, может и дополнительный называется, давно уж отучился и забыл все названия :) Вообще советую всем ознакомиться со ссылкой alcoSHoLiK-а.

IGR 22.11.2007 17:36

Re: Shl, Shr, Sar
 
ну с битовыми о-циями я знаком (с уч. курса) !!

а как насчет:
Цитата:

а что означает:
value = temp shl 2 And $FFFFFF

alcoSHoLiK 22.11.2007 17:41

Re: Shl, Shr, Sar
 
Первая половина твоего сообщения противоречит второй.

IGR 22.11.2007 18:59

Re: Shl, Shr, Sar
 
Цитата:

Первая половина твоего сообщения противоречит второй.
Ладн, будем учится на ошибках !!

value = temp shl 2 And $FFFFFF аналогично:
value = temp*4 + 16777215 !!

Да/Нет ??

alcoSHoLiK 22.11.2007 19:17

Re: Shl, Shr, Sar
 
Нет.
Цитата:

«(Логическое) И» (and) — аналог конъюнкции в логике. Иногда называется логическим умножением.

Выдаёт 1 если оба входа равны 1, в противном случае 0. Если один из аргументов равен 1, то результат «И» равен другому. Если один из аргументов равен 0, то результат «И» равен 0 независимо от значения другого аргумента.
Представь число temp в двоичном виде, тогда все станет ясно:
Код:

temp = 880

temp:                000000000000001101110000
$FFFFFF:        111111111111111111111111
----------------------------------------
Result:                000000000000001101110000

Более приближенный к реальности пример. Если тебе нужно зациклить переменную, т.е. сделать, чтобы при достижение определенного максимального значения она обнулялась, сделать это можно так:
Код:

max = $FF

x = (x + 1) and max

Битовое представление:
Код:

x = 30

x:        11110
$FF:        11111
-------------
        11110

// прибавляем единицу, x =31
x:        11111
$FF:        11111
-------------
        11111

// прибавляем единицу еще раз, x = 32
x:        100000
$FF:        011111
--------------
        x = 0


IGR 23.11.2007 14:28

Re: Shl, Shr, Sar
 
спс !!
врод понял !!

value = 452 это 111000100
$fff это 111111111111

000111000100
111111111111
--------------
000111000100 - результат !!

Да/Нет ??


Часовой пояс GMT +4, время: 15:53.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot