Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rento

com números 1 2 4 8 16....

Recommended Posts

Que eu bem lembre da aula de matemática, quando fizesse essa conta

2^10 seria 1024, e assim por diante...

Isso ai eu até sei, e também sei que quando somado qualquer um desses números, com eles mesmos, obtemos um numero único.

 

Mas ai que mora minha dúvida, se eu tenho 3 checkbox, respectivamente valendo: 1, 2, 4, e marco o 2º e o 3º, terei 6. Tenho que fazer um IF?

if valor = 6 then

begin

check2.checked := true;

check3.checked := true;

end

else if valor = 3 then

begin

check1.checked := true;

check2.checked := true;

end

...

 

isso da uma lista enorme, não existe algum jeito mais certo não?, porque imagina so, com 131072 + 65536 + 4 + 16

É imbecisse fazer os ifs

 

 

1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072

 

 

 

 

Por favor me ajudem!

Se existir alguma função que retorne quais números desses estão no numero mestre.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é só fazer a conta contrária.

 

exemplo: o número digitado é 10:

 

10/2 = 5 resto 0

05/2 = 2 resto 1

02/2 = 1 resto 0

 

pegando do ultimo valor calculado (2/2 = 1) tem-se 10 em binário 1010.

 

outro exemplo 15:

 

15/2 = 7 resto 1

07/2 = 3 resto 1

03/2 = 1 resto 1

 

resultado: 1111

 

assim você pode ir fazendo as contas e marcando os checkboxes a cada conta. uma maneira mais bonita de fazer seria colocar na propriedade TAG dos checkboxes os indices sequenciais (1,2,3,4,5,6) e para cada passo da conta que você faz, você coloca o resultado no Checkbox apropriado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi em partes o que você quer fazer, mas digamos que você tenha o n° 17, o que deveria fazer e marcar ?

Todos os CheckBox já devem de aparecer na tela ? Ou vai informar um número e o programa deve de criar os CheckBox e então marcar somente os corretos ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui vai um exemplo que axei em HTML+java script:

 

http://rapidshare.com/files/91342469/Exemplo.rar.html

 

A parte do código é essa:

function biAND(flags, flag)
{
	for (var i = 0; i < 1; ++i){
		if(i < 2){
			var r1 = flags.digits[i]
			var r2 = flag.digits[i]
			var result = r1 & r2

			if(result != 0){
				return true
			}
		}
	}
	return false
}
OBS: no HTML eu editei o valor, para muda precisa modifica lo pela mão(linha 41)

Mas não sei o que o & faz nessa classe (BigInt)

 

Ja tantei mod, potencia, soma, soma como texto:

procedure TForm1.BitBtn1Click(Sender: TObject);
   function test(flags, flag: Integer): Boolean;
   var s1, s2, s3: string;
   var d1, d2: string;
   var I: Integer;
   begin
	  Result := False;
	  d1 := IntToStr(flags);
	  d2 := IntToStr(flag);
	  for I := 0 to Length(d1) do
		 begin
		 if I <= Length(d2) then
			begin
			s1 := Copy(IntToStr(flags), i, 1);
			s2 := Copy(IntToStr(flag), i, 1);
			s3 := FloatToStr(Power(StrToFloat(s2), StrToInt(s1)));
			if s3 <> '0' then
			   Result := True
			else
			   Result := False;
			end;
		 end;
   end;
const x=12;
begin
   CheckBox1.Checked := test(x, 1);
   CheckBox2.Checked := test(x, 2);
   CheckBox3.Checked := test(x, 4);
   CheckBox4.Checked := test(x, 8);
   CheckBox5.Checked := test(x, 16);
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consegui, até consegui fazer(eu acho) as 2 rotinas de transformar os números, mas ela mesma não:

 

procedure TForm1.BitBtn1Click(Sender: TObject);
   function fbin(X: string): string;
   var
	 DecToBin, resto, I: Integer;
	 binario: string;
   begin
	  DecToBin := StrToInt(x);
	  while dectobin > 0 do
		 begin
		 resto := DecToBin mod 2;
		 result := Result + IntToStr(resto);
		 if resto = 0 then
			DecToBin := DecToBin div 2
		 else
			begin
			Dec(DecToBin);
			DecToBin := DecToBin div 2;
			end;
		 end;
	  for I := Length(result) downto 1 do
		 begin
		 binario := binario + Copy(Result, I, 1);
		 end;
	  Result := binario;
   end;

   function bit_a_bit(bit1, bit2: string): string;
   var
	I: Integer;
	S: string;
   begin
	  S := '';
	  for I := 1 to 8 do
		 begin
		 if Copy(bit1, I, 1) = '' then
			begin
			SetLength(bit2, I);
			bit2[I] := '1';
			end;
		 if Copy(bit1, I, 1) = Copy(bit2, I, 1) then
			S := S + '1'
		 else
			S := S + '0';		 
		 end;
	  Result := S;
   end;

   function test(flags, flag: Integer): Boolean;
   var s1, s2, s3: string;
   var d1, d2: string;
   var I: Integer;
   begin
	  Result := False;
	  d1 := IntToStr(flags);
	  d2 := IntToStr(flag);
	  for I := 0 to Length(d1) do
		 begin
		 if I <= Length(d2) then
			begin
			s1 := Copy(IntToStr(flags), i, 1);
			s2 := Copy(IntToStr(flag), i, 1);
			s3 := bit_a_bit(fbin(s1), fbin(s2));
			//ShowMessage(s1 + '|' + fbin(s1)+#10#13 + s2 +'|'+ fbin(s2) + ' = ' + s3);
			if s3 <> '0' then
			   Result := True
			else
			   Result := False;
			end;
		 end;
   end;

const x= 13;
begin
   CheckBox1.Checked := test(x, CheckBox1.Tag);
   CheckBox2.Checked := test(x, CheckBox2.Tag);
   CheckBox3.Checked := test(x, CheckBox3.Tag);
   CheckBox4.Checked := test(x, CheckBox4.Tag);
   CheckBox5.Checked := test(x, CheckBox5.Tag);
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ae pessoal! Me interessei por esse problema e fiquei tentando resolver. Quando cheguei a uma solução, percebi que era a sugerida pelo primeiro a responder (não lembro o nome).

Eu não fiz no Delphi, mas acho que consigo explicar o que ele quis dizer:

-Converta o número em questão para binário (se não souber fazer essas operações posso ajudar depois).

-Armazene esse binário em um vetor ou em uma string. (prefiro colocar em uma fila de inteiros)

-Verifique posição por posição do binário; onde for 1 o seu CheckBox correspondente deve ser marcado como verdadeiro; onde for 0 marcado como falso

 

Se você está trabalhando apenas com valores que são potências de 2, fica bem fácil de entender.

 

Ex: 142

 

142 = (128 + 8 + 4 + 2)

 

Convertendo em binário (deixando o bit mais significativo do lado esquerdo) = 10001110

 

Agora você já sabe quais CheckBox precisa marcar. Seriam: 7º, 3º, 2º e 1º.

Porque o número binário você descarta os 0, que são falsos, e pegá os 1. Na posição do 1 ele vale 2^posição. (conversão de binário para inteiro).

 

você pode utilizar tags nos seus CheckBox para marcar a posição deles automaticamente quando varrer o número binário. Para cada iteração você verifica se é 1, se for o ChecckBox correspondente deve ser marcado como verdadeiro.

 

Bom, acho que é isso. Espero ter conseguido explicar direito o que quis dizer!

 

Até mais.

 

Francis Rangel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora so falta o marcos. converte o que ele disse pq num manjo de bit

 

o que seria a matemática 2^posição? acho que é power(2, posição)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu vou tentar montar um conversor de de inteiro para binário aqui e também um de binário para inteiro. Eu posto quando terminar.

Mas se você quiser tentar, o método é o seguinte. você pega o número que quer converter e divide por 2. O "resto" (não lembro nome matemático) é o digito do seu número binário. Então se o número for ímpar vai ser 1 e se for par vai ser 0. Depois você pega o quociente (resultado da divisão, não sei se o nome tá certo) e divide por 2, pega o resto e coloca como próximo digito do binário. você repete essa operação até ficar 1 ou 2 no quociente, divide mais uma vez e acabou.

Ai você pega os "restos" do último para o primeiro e concatena, esse é o seu binário.

 

E a questão de 2^posição, seria 2 elevado a posição. No delphi é Var := Power(Var,Expoente). Então pra converter o binário pra inteiro você pega a posição onde tem um '1' e faz: numInteiro := Power(2,posição1) + Power(2,posicao2) + (...) + Power(2,posicaoN).

Cada posição é onde você tem um '1' no binário. Lembrando que começa da posição 0 (bit menos significativo) e vai até N posições.

 

Eu vou tentar montar aqui o conversor, mas eu não garanto.

Até mais!

 

Francis Rangel

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função bin tá aqui:

function fbin(X: string): string;
   var
	 DecToBin, resto, I: Integer;
	 binario: string;
   begin
	  DecToBin := StrToInt(x);
	  while dectobin > 0 do
		 begin
		 resto := DecToBin mod 2;
		 result := Result + IntToStr(resto);
		 if resto = 0 then
			DecToBin := DecToBin div 2
		 else
			begin
			Dec(DecToBin);
			DecToBin := DecToBin div 2;
			end;
		 end;
	  for I := Length(result) downto 1 do
		 begin
		 binario := binario + Copy(Result, I, 1);
		 end;
	  Result := binario;
   end;
Mas nem sempre retorna 4 ou 8 negocios oO

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.