Jump to content
Hercles

Operador shl em Pascal

Recommended Posts

Hercles

Caros, estou com dificuldade para entender este código o número 1 depois do shl faz parte da sintaxe?

procedure TForm1 . rever seOneBi t ( var xnum, hshift : integer ) ;
begin

hshift := ( hshift Shl 1)   or   (xnum and 1 ) ;

xnum := xnum Shr 1 ;

end ;

Edited by Hercles
Formatação corrigida.

Share this post


Link to post
Share on other sites
I-NOZex

http://www.delphibasics.co.uk/RTL.asp?Name=Shl

DescriptionThe Shl keyword performs a bitwise shift left of an Integer. The number is shifted Bits to the left.

If Bits is greater than the size of the number type, the Bits value is Mod'ed by the number type size before the shift.

For example;

var

myByte : Byte;

begin

myByte := $2F; // $2F = 47 decimal

myByte := myByte Shl $24;

end;

Gives the same result as Shl 4 = $F0.

espero ajudar ;)

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
Hercles

Isto quer dizer, no exemplo ai, que a mudança só vai ocorrer se for menor ou igual a $24?

Share this post


Link to post
Share on other sites
I-NOZex

nao faço minima, eu nem conhecia o comando, e sinceramente nao consigo entender suficientemente para te tentar explicar...


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
nunopicado

Os SHL e SHR são operadores binários, com funções muito específicas.

Servem para mover à esquerda ou à direita, respectivamente, os bits de um determinado valor.

O seu comportamento é algo imprevisível quando não estamos a lidar com números binários, o que me leva a perguntar:

O que precisas fazer exactamente?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Flinger

Isto quer dizer, no exemplo ai, que a mudança só vai ocorrer se for menor ou igual a $24?

Não. Quer dizer que a operação só é executada como escrito se o número de bits a rodar for inferior ao tamanho da variável. No caso do exemplo tinha de ser 8.

Também não percebi direito o que é feito com o operador caso este tamanho seja maior...

Edited by Flinger

Share this post


Link to post
Share on other sites
Hercles

O código inicial que eu postei, trata-se de um programa que inverte os números binários.... mas não sei se ele só faz a condição de ser maior ou igual....

Share this post


Link to post
Share on other sites
Flinger

O código inicial que eu postei, trata-se de um programa que inverte os números binários.... mas não sei se ele só faz a condição de ser maior ou igual....

Olhando para o código com olhos de ver, sim faz sentido. Mas não percebi a tua dúvida acerca da condição. No teu código só rodas um bit de cada vez, logo não tens problemas com isso. O que tens de fazer é chamar esse teu procedimento X vezes, sendo que X é o número de bits da varíavel original (xnum)

Share this post


Link to post
Share on other sites
Hercles

é confuso este códio...

procedure TForm1 . rever seOneBi t ( var xnum, hshift : integer ) ;   //  Aqui tenho duas variáveis que são do tipo inteiro, que recebe os parametro do programas....
begin

hshift := ( hshift Shl 1) or (xnum and 1 ) ;   // aqui a variável hshift vai receber uma das "situaçãoes" , não entendo.

xnum := xnum Shr 1 ;   // aqui xnum vai receber ele mesmo mas com o shr 1.   não entendo

end ;

Edited by Hercles
Adicionadas tags GeShi

Share this post


Link to post
Share on other sites
Flinger

procedure TForm1 . rever seOneBi t ( var xnum, hshift : integer ) ;
begin

hshift := ( hshift Shl 1)   or   (xnum and 1 ) ;

xnum := xnum Shr 1 ;

end ;

hshift é rodado uma vez para a esquerda e recebe o valor do bit mais à direita de xnum,

xnum é rodado para a direita de forma a que o próximo bit seja tratado na próxima chamada.

Um exemplo:

para xnum = 10000010 (130)

e com hshift inicial =0:

primeira chamada

hshift:= 0 or 0 (bit mais à direita de xnum);

xnum = 01000001

2.ª chamada:

hshift = 0 or 1 = 1

xnum = 00100000

3.ª chamada

hshift = 10 (1 shl 1) or 0

xnum = 00010000

e por aí fora até à 8ª chamada em que ficas com

hshift = 01000001

xnum = 00000000

Edited by Flinger

Share this post


Link to post
Share on other sites
Hercles

Caramba! show! Estes dois comandos (SHL e SHR) abrem um leque de possibilidades de programação.

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
thoga31

Não são comandos, são operadores que são ao mesmo tempo palavras reservadas.

Eu não sou especialista de operações bitwise, mas elas são uma ferramenta poderosíssima. Nestas operações, and, or e xor ganham significados totalmente diferentes, apesar de na sua base estar à mesma os princípios da lógica. Estes são, ao mesmo tempo, operadores binários (operações bitwise) e lógicos (operações booleanas).


Knowledge is free!

Share this post


Link to post
Share on other sites
I-NOZex

sem qerer gerar offtopic, mas, qual ai dos gurus de delphi/pascal vai fazer um tutorial na wiki sobre estes operadores?

é que na verdade ha muitos poucos exemplos na web, e ta tudo em ingles... e eu ainda nao entendi totalmente, por isso ficava agradecido ;)


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
Hercles

Boa ideia I-NOZex. Acho que muitas pessoas vão poder programar melhor quando descobrirem mais possibilidades... Percebi que muitas pessoas desconhecem ou não dão muita importancia a estes operadores e criam algoritmos imensos. :)

Share this post


Link to post
Share on other sites
pwseo

Tópico movido e título alterado para algo aceitável. Hercles, mais uma vez vou avisar-te para teres mais cuidado com a escrita, especialmente tratando-se do título de um tópico.

Relativamente à inversão de números binários, porque não fazer isso dentro de um ciclo em vez de termos que executar a funçao x vezes?

const
 BYTEBITS = 8; { nº de bits num byte }

function reverseBits(orig: byte): byte;
var
 i: integer;
 b: byte = 0;
begin
 for i := 0 to SizeOf(orig) * BYTEBITS - 1 do
   b := (b shl 1) or ((orig shr i) and $01);

 reverseBits := b;  { em Delphi é 'result' em vez de 'reverseBits' }
end;

Por alto, esta função vai isolando o último bit de orig e vai "colando" esse bit sempre à direita de b, o nosso resultado temporário. Em cada iteração fazemos shift para a direita de orig para passar ao bit seguinte, e shift para a esquerda de b, para "arranjar espaço" para o bit que "removemos" de orig.

Dada a minha falta de tempo, deixo os pormenores destas operações para quem quiser investigar.

Aqui fica um exemplo no Ideone.

ADENDA:

É importante ter em conta que os efeitos dos operadores shl e shr (e seus equivalentes noutras linguagens) está bem estabelecido e é geralmente concordante quando estamos a falar de números inteiros não-negativos; nos restantes casos pode haver diferenças, e existem particularidades no que diz respeito à forma como se procede ao shifting propriamente dito.

Quando puder publico aqui como se comporta o FreePascal nesse aspecto.

Edited by pwseo

Share this post


Link to post
Share on other sites
Hercles

Acho que tem que executar n vezes porque tem uma outra parte do exercícios que eu não postei aqui... Eu acho que é isso! Além da inversão, tem uma animação que vai passando de Tedit em Tedit (aonde vai esta cada número binário) que fica vermelha.

Share this post


Link to post
Share on other sites
passarito

Boas,

Vamos lá desmistificar isto.

Não se tem de executar os comandos n vezes, a não ser que se coloque a seguir aos comandos/operadores SHL ou SHR um 1

Se quisermos mover 5 bits para a direita fazemos simplesmente:

01010101 SHR 5

Isto vai dar 00000010

Deixo aqui 2 excelentes explicações. 1 em pdf-PT e outra em video-UK

https://www.youtube.com/embed/_Z3yz0k9dmQ?feature=oembed

http://www.passeidireto.com/arquivo/970424/apost-turbo-pascal/4

Edited by Rui Carlos
  • Vote 1

Share this post


Link to post
Share on other sites
Flinger

Passarito, ninguém disse isso... Estava simplesmente a analisar o código que o op postou e a interpretar o que ele faz.

Share this post


Link to post
Share on other sites
passarito

@Flinger, eu sei que não disseste isso, mas deu-me a ideia aos poucos se estava a dar ideia que apenas dava para deslocar bit a bit, então quiz esclarecer isso e outras dúvidas que pudessem existir através dos 2 links.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.