XOR
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!
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
Curtidas 0
Respostas
Massuda
09/03/2005
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?
GOSTEI 0
Fatima
09/03/2005
São comparados os caracteres das strings!!!
GOSTEI 0
Massuda
09/03/2005
Não sei se entendi direito, mas assumindo que as strings tem o mesmo tamanho...Se as strings tem tamanho diferente uma da outra precisaria decidir como fazer o XOR entre as duas.
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;
GOSTEI 0
Massuda
09/03/2005
... 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.GOSTEI 0
Fatima
09/03/2005
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!!
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!!
GOSTEI 0
Massuda
09/03/2005
Testei este código...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).
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]));
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).
GOSTEI 0
Beppe
09/03/2005
É, 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´.
GOSTEI 0
Motta
09/03/2005
Alguém já viu uma regra de negocio em que o xor se aplica, fora criptografia etc , diga uma regra mesmo??
GOSTEI 0
Kapak
09/03/2005
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.
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.
GOSTEI 0
Massuda
09/03/2005
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)GOSTEI 0
Beppe
09/03/2005
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.
GOSTEI 0
Massuda
09/03/2005
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?GOSTEI 0
Motta
09/03/2005
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.
GOSTEI 0
Beppe
09/03/2005
[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)
GOSTEI 0
Massuda
09/03/2005
... http://en.wikipedia.org/wiki/Xor_linked_list ...
Interessante... isso talvez tivesse sido útil no tempo que eu trabalhava com microprocessadores de 8 bits.GOSTEI 0