GARANTIR DESCONTO

Fórum XOR #271641

09/03/2005

0

Oi,

Estou com um problema: preciso utilizar a operação X xor Y, mas o X e o Y são strings (ex.: CASA), e este operador só compara Integer, e não é possível converter este tipo de string (CASA) em Inteiro!!!

Como posso fazer??

Obrigada!


Fatima

Fatima

Responder

Posts

09/03/2005

Massuda

XOR entre strings não faz sentido... por acaso não seria XOR entre os caracteres de duas strings, tipo o primeiro caractere de uma string faz XOR com o primeiro caractere de outra string?


Responder

Gostei + 0

09/03/2005

Fatima

São comparados os caracteres das strings!!!


Responder

Gostei + 0

09/03/2005

Massuda

Não sei se entendi direito, mas assumindo que as strings tem o mesmo tamanho...
function EmbaralhaComXor(S1, S2: string): string;
var
  I: Integer;
begin
  Result := ´´;
  for I := 1 to Length(S1) do
    Result := Result + Chr(Ord(S1[I]) xor Ord(S2[I]));
end;
Se as strings tem tamanho diferente uma da outra precisaria decidir como fazer o XOR entre as duas.


Responder

Gostei + 0

09/03/2005

Massuda

... Tentei fazer como me mostrou, mas dá o mesmo erro!! Ao pegar o 1º elemento da matriz (por ex. a letra C da palavra CASA), dá a seguinte msg. de erro: ... EConvertError with message ´´C´ is not a valid integer value! ´´
Será que você poderia postar aqui o código onde deu o problema? Como eu não entendi direito o que você quer fazer, talvez seja mais fácil entender vendo como você quer utilizar isso.


Responder

Gostei + 0

09/03/2005

Fatima

Na verdade, o código está exatamente da maneira como vc me mostrou!!

for i:= 1 to Length(Str1) do
begin
Str1[i]:= Chr(Ord(Str1[i]) xor Ord(Str2[i]));
end;

E ele naum consegue converter nenhuma letra, mas fiz o teste com número: ´1´ e deu certo!! >> Mas preciso q seja com letra!!

** Eu apenas tento comparar duas strings através da operação XOR retornando uma outra string!! Naum sei o q pode estar errado!!


Responder

Gostei + 0

09/03/2005

Massuda

Testei este código...
var
  I: Integer;
  S1: string;
  S2: string;
...
  S1 := ´CASA´;
  S2 := ´RISO´;
  for I := 1 to Length(S1) do
    S1[I] := Chr(Ord(S1[I]) xor Ord(S2[I]));
E compilou/executou sem problemas.

Mas tem o seguinte detalhe: o resultado em S1 é uma string que, na maior parte dos casos, irá conter caracteres não imprimíveis (irá aparecer um caractere ´quadradinho´ ou lixo).


Responder

Gostei + 0

09/03/2005

Beppe

É, acho que vc chama um StrToInt(Str1) após feito os XOR´s. Como o Massuda disse, os caracteres retornados nem sempre seram de ´0´ até ´9´.


Responder

Gostei + 0

09/03/2005

Motta

Alguém já viu uma regra de negocio em que o xor se aplica, fora criptografia etc , diga uma regra mesmo??


Responder

Gostei + 0

10/03/2005

Kapak

Pelo que entendí, (s3 := s1 xor s2); s3 deve conter:
1-Tudo que está em s1 e não em s2.
2-Tudo que está em s2 e não em s1.

Bom, se for isto, acredito que fazendo um bitwise xor do valor ordinal de cada caracter, não servirá p/ nada.

Respondendo ao colega Motta, xor também é utilizado em cálculos de CRC que também é um tipo de criptografia, mas de validação.


Responder

Gostei + 0

10/03/2005

Massuda

Pelo que entendí, (s3 := s1 xor s2); s3 deve conter ... se for isto, acredito que fazendo um bitwise xor do valor ordinal de cada caracter, não servirá p/ nada.
Isso faz mais sentido! :o Não tinha pensado nisso :oops:.

Alguém já viu uma regra de negocio em que o xor se aplica, fora criptografia etc , diga uma regra mesmo??
Acho que é difícil ter regra de negócio enunciada em termos de xor porque as pessoas tendem a raciocinar em termos de and, or e not. Posso estar enganado, mas acho que um xor pode ser expresso em termos de and, or e not. (desconfio que isso ficou confuso)


Responder

Gostei + 0

10/03/2005

Beppe

Alguém já viu uma regra de negocio em que o xor se aplica, fora criptografia etc , diga uma regra mesmo??

Regra de negócio? Mim naum falar seu língua... :oops: Mas o operador XOR pode ser usado para implementar uma lista duplamente encadeada com apenas um ponteiro por nó.

Pelo que entendí, (s3 := s1 xor s2); s3 deve conter: 1-Tudo que está em s1 e não em s2. 2-Tudo que está em s2 e não em s1.

Também não tinha me tocado disso. Com sets dá pra fazer de forma eficiente, i. e., S3 := (S1 - S2) + (S2 - S1). O problema com esta implementação é a impossibilidade de se representar multi-sets(conjuntos com elementos repetidos). Aí tem que ser uma string ou lista ordenada.

Posso estar enganado, mas acho que um xor pode ser expresso em termos de and, or e not. (desconfio que isso ficou confuso)

Pode sim. A xor B = A and not B or B and not A. Acredito que esta seja a forma minimalista.


Responder

Gostei + 0

10/03/2005

Massuda

Saindo um pouco do assunto...

... o operador XOR pode ser usado para implementar uma lista duplamente encadeada com apenas um ponteiro por nó...
Você teria algum exemplo ou algum link com um exemplo disso?


Responder

Gostei + 0

10/03/2005

Motta

Não quis saber se alguém já usou xor numa regra de negócio de programa, uma curiosidade apenas pois não é muito lógico para isto.


Responder

Gostei + 0

11/03/2005

Beppe

[quote:04e42f162c=´Beppe´]... o operador XOR pode ser usado para implementar uma lista duplamente encadeada com apenas um ponteiro por nó...
Você teria algum exemplo ou algum link com um exemplo disso?[/quote:04e42f162c]
http://en.wikipedia.org/wiki/Xor_linked_list

Em suma:
- eficiente em espaço
- ineficiente em tempo
- não trabalha com GC´s pró-ativos(proibem ponteiros calculados)


Responder

Gostei + 0

11/03/2005

Massuda

... http://en.wikipedia.org/wiki/Xor_linked_list ...
Interessante... isso talvez tivesse sido útil no tempo que eu trabalhava com microprocessadores de 8 bits.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar