rento 0 Denunciar post Postado Fevereiro 6, 2008 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
Fabiano Novaes Ferreira 0 Denunciar post Postado Fevereiro 6, 2008 é 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
rento 0 Denunciar post Postado Fevereiro 6, 2008 hehe vou fingir que entendi :D Mais tarde eu testo :D vlw Compartilhar este post Link para o post Compartilhar em outros sites
rento 0 Denunciar post Postado Fevereiro 12, 2008 Outra pessoa pode explicar? não entendi mesmo. Se for 10 deduzo que foi marcado o 4 e o 6, nenhum deles tem ai Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Fevereiro 12, 2008 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
rento 0 Denunciar post Postado Fevereiro 13, 2008 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
marcio.theis 3 Denunciar post Postado Fevereiro 13, 2008 E bit-a-bit: retorna bit 1 para cada posição de bits iguais a 1 nos operandos e zero nos demais casos. Compartilhar este post Link para o post Compartilhar em outros sites
rento 0 Denunciar post Postado Fevereiro 13, 2008 Não entendi tudo. Então se for em Bit 102030 e o outro 102230 fica 111011 ? Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Fevereiro 13, 2008 Veja neste link: http://www.mspc.eng.br/info/jscriptOper.asp#bit_a_bit Compartilhar este post Link para o post Compartilhar em outros sites
rento 0 Denunciar post Postado Fevereiro 13, 2008 valeu, assim que fazer a rotina posto aqui, agora vo procura como pega bit a partir de números pelo delphi. Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Fevereiro 13, 2008 beleza... :D Compartilhar este post Link para o post Compartilhar em outros sites
rento 0 Denunciar post Postado Fevereiro 13, 2008 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
Francis Rangel 0 Denunciar post Postado Fevereiro 15, 2008 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
rento 0 Denunciar post Postado Fevereiro 15, 2008 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
Francis Rangel 0 Denunciar post Postado Fevereiro 16, 2008 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
rento 0 Denunciar post Postado Fevereiro 16, 2008 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