Jump to content

Omesmo

Super VIP
  • Posts

    1,635
  • Joined

  • Last visited

  • Days Won

    6

Posts posted by Omesmo

  1. o chat gpt dando lição de moral kkk

     

    Spoiler
    se na minha religião nao puder comer carne, e eu chamar a salada de fruta de bife de figado e comer imaginando que é um suculento bife acebolado, eu estarei pecando?
     
     

    Como modelo de linguagem, não estou programado para discutir questões religiosas ou julgar as escolhas pessoais de alguém. No entanto, se você está seguindo as práticas alimentares da sua religião, pode ser importante para você seguir essas práticas de maneira sincera e respeitosa. Fingir que está comendo carne quando está na verdade comendo frutas pode não estar em conformidade com os princípios éticos e espirituais da sua religião.

    É sempre importante lembrar que as escolhas alimentares são pessoais e podem variar de acordo com crenças e valores individuais. Se você está enfrentando dificuldades para seguir as práticas alimentares da sua religião, talvez seja útil falar com um líder religioso ou buscar aconselhamento para ajudá-lo a encontrar uma solução que funcione para você.

     

    • Like 1
  2. 19 minutos atrás, rockcavera disse:

    Quando se usa esses builtins no gcc, tem que passar -mpopcnt ao compilar para ele usar a instrução popcnt. Caso contrário ele usa um hack que não é de instrução única.

    é eu estava lendo sobre isso, aliais o proprio gpt tinha escrito sobre isso ao passar o exemplo de função
    mas mesmo que eu quisesse nao daria, já que esse all in lerdo nao tem , o meu antigo só tinha  sse4.2
    no caso como eu prefiro o vba e usar o excel  eu faria primeiro uma função em dll que fizesse bitwise em 2 inteiros e retornasse a contagem de bit do resultado, e no proprio vba teria uma função para criar previamente a matriz de inteiros das combinações

  3. estava vendo os codigos gerados pelo gpt e reparei nisso
    if (__builtin_popcount(i) == k) { // verifica se i tem exatamente k bits definidos

    __builtin_popcount(i)

    pesquisando vi que apesar de nao ser padrão do C tem compilador que incorpora funções desse tipo como o GCC

    para int use __builtin_popcount(n)

    para int longo use __builtin_popcountl(n)

    para long long int use __builtin_popcountll(n)

    o problema é que parece que precisaria fazer um para cada tipo, se fosse escolhido o tipo em tempo de execução ficaria mais lento

     

    pedi para o gpt montar um contador de bits para 100bits usando assembly numa função c
     

    #include <stdint.h>
    
    uint64_t popcnt_100bits(const void *ptr)
    {
        uint64_t count;
        __asm__ volatile (
            "movdqu xmm0, [%[ptr]] \n"
            "movdqu xmm1, [%[ptr]+16] \n"
            "movdqu xmm2, [%[ptr]+32] \n"
            "movdqu xmm3, [%[ptr]+48] \n"
            "movdqu xmm4, [%[ptr]+64] \n"
            "pshufb xmm5, xmm0 \n"
            "pshufb xmm6, xmm1 \n"
            "pshufb xmm7, xmm2 \n"
            "pshufb xmm8, xmm3 \n"
            "pshufb xmm9, xmm4 \n"
            "popcnt %[count], xmm5 \n"
            "popcnt %%rdx, xmm6 \n"
            "add %[count], %%rdx \n"
            "popcnt %%rcx, xmm7 \n"
            "add %[count], %%rcx \n"
            "popcnt %%rbx, xmm8 \n"
            "add %[count], %%rbx \n"
            "popcnt %%rsi, xmm9 \n"
            "add %[count], %%rsi \n"
            : [count] "=r" (count)
            : [ptr] "r" (ptr)
            : "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "xmm8", "xmm9", "memory"
        );
        return count;
    }
    Citar

    Neste código, a função C popcnt_100bits chama o código em assembly que conta o número de bits definidos como 1 em um número de 100 bits. A função C declara uma variável count para armazenar o resultado do cálculo em assembly. A instrução __asm__ volatile é usada para incorporar o código assembly em uma função C.

    Os registradores xmm0 a xmm9 são usados para armazenar os valores dos registradores SIMD SSE, e a opção memory é usada para notificar o compilador que a função pode acessar a memória. A opção r é usada para especificar que o ponteiro ptr é passado como um registrador. A opção =r é usada para especificar que a variável count é passada como um registrador de saída. As instruções movdqu, pshufb e popcnt são as mesmas que as usadas no código em assembly que eu apresentei anteriormente.

    eu adoraria fazer funções em dll para usar em planilhas

    apesar da maioria das coisas que eu faço funcionar muito bem em vba tem uns testes meus que demora muito pelo grande numero de testes que faz

    • Like 1
  4. 2 horas atrás, rockcavera disse:

    A minha experiência em si não é com C, tendo em vista que hoje em dia não é considerado uma linguagem "moderna", mas, sim, com Nim, que compila para C. Ou seja, no final das contas eu uso C só que com uma camada de abstração de Nim.

    em comparação o ruim do c é que nao tem um coletor de lixo e tudo tem que ser feito manualmente

    no geral  a maiorias das linguagens modernas seguiram o C

    o rum para mim é a estrutura e operadores  (){}; :: && ...

    claro que com o tempo e uso se acostuma , mas merds pq fizeram assim, seria tão dificil fazer um compilador que usasse uma estrutura mais "humana" igual o basic que usa operadores usados igual na matemática?
    por isso o basic é tão facil de se pegar, é pq já aprendemos parte no colegio mesmo e nem é em programação, fora que acompanhar a estrutura de codigos mais complexos é mais facil ainda mais com loops e ifs alinhados

    sobre o POPCNT, acho que tem a partir do intel i de primeira geração no sse4.2 e acho que trabalha com 128 bit que de qualquer forma tem que ser dividido numa matriz

     

    ao meu ver se for transformar uma matriz de dezenas em um inteiro acho que valeria mais a pena já dividir na conversão
    de 1 a 32, inteiro A
    de 33 a 64 = valor -32 , inteiro B

    bem, eu estou só com um az1100 amd e-350 apu all in one , muito ruim, consegui até compilar usando o dev-c++ mas tenho paciência de jó nao , então vou dar um tempo no aprendizado

     

    • Like 1
    • Haha 1
  5. 32767 49151 81919 147455 278527 540671 1064959 2113535 4210687 8404991 16793599
      57343 90111 155647 286719 548863 1073151 2121727 4218879 8413183 16801791
        106495 172031 303103 565247 1089535 2138111 4235263 8429567 16818175
          204799 335871 598015 1122303 2170879 4268031 8462335 16850943
            401407 663551 1187839 2236415 4333567 8527871 16916479
              794623 1318911 2367487 4464639 8658943 17047551
                1581055 2629631 4726783 8921087 17309695
                  3153919 5251071 9445375 17833983

     

     

    This sequence of numbers appears to be a pattern of values that increase by multiplying the previous value by 1.5 and then adding 1. Here's the first few numbers in the sequence with this calculation:

    32767

    32767 * 1.5 + 1 = 49151

    49151 * 1.5 + 1 = 81919

    81919 * 1.5 + 1 = 147455

    147455 * 1.5 + 1 = 278527

    278527 * 1.5 + 1 = 540671

    540671 * 1.5 + 1 = 1064959

    1064959 * 1.5 + 1 = 2113535

    2113535 * 1.5 + 1 = 4210687

    4210687 * 1.5 + 1 = 8404991

    8404991 * 1.5 + 1 = 16793599

     

    kkk esse gpt as vezes tem preguiça

     

    • Like 1
  6. 16 minutos atrás, Omesmo disse:

    tipo aquele gerador de combinações assembly para pb
    ele deu uma descrição do que faz  o problema é que pedir para gfazer em C e ela fez em swift kkkk, eu nem tinha reparado até ler o nome
     

    no sufoco consegui fazer ele gerar em C
    as vezes é necessário reiniciar o chat ou criar um do zero, senao ele se confunde nas coisas que ele mesmo disse

     

    Citar
    consegue montar o mesmo codigo dentro da linguagem "C" ?
     
     

    Sim, é possível traduzir o código do PowerBASIC para C. No entanto, é importante lembrar que o código original contém algumas variáveis e declarações globais, e que essas variáveis precisariam ser replicadas de alguma forma em C.

    Abaixo está uma tradução aproximada do código do PowerBASIC para C. Esta tradução é apenas um ponto de partida e pode precisar ser ajustada para atender às necessidades específicas do projeto:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_COMBS 51000000
    
    long lotto_combs[MAX_COMBS * 7];
    long *ptr2_lotto_combs;
    
    long number_of_combinations = 0;
    long *ptr2_number_of_combinations;
    
    long full_number = 0;
    long *ptr2_full_number;
    
    void generate_combinations() {
        asm {
            push ebx
            push ecx
            push edx
            push esi
            push edi
            
            mov esi, ptr2_lotto_combs
            mov edi, ptr2_number_of_combinations
            mov ebx, ptr2_full_number
    
            mov edx, 1
            mov eax, [ebx]
            mov ecx, [eax]
            shl ecx, 1
    
            mov [edi], 0
    
        startloop:
            mov [esi+edx-1], 1
            call next_combination
            cmp [eax], 0
            jne add_combination
            jmp endloop
    
        add_combination:
            add [edi], 1
    
        endloop:
            cmp edx, ecx
            jne startloop
    
            pop edi
            pop esi
            pop edx
            pop ecx
            pop ebx
        }
    }
    
    void next_combination() {
        asm {
            push ebx
            push ecx
            push edx
            push esi
    
            mov esi, ptr2_lotto_combs
            mov ebx, ptr2_full_number
            mov edx, 7
    
            loop1:
                dec edx
                mov ecx, [esi+edx-1]
                cmp ecx, [ebx]
                je loop1
                mov [esi+edx-1], ecx+1
                mov eax, edx
                mul eax
                sub eax, edx
                mov edx, 6
                div edx
                mov ecx, [esi+eax*6-6]
                mov ebx, [esi+edx*6-6]
                cmp ecx, ebx
                jb loop1
    
            pop esi
            pop edx
            pop ecx
            pop ebx
        }
    }
    
    int main() {
        ptr2_lotto_combs = &lotto_combs[0];
        ptr2_number_of_combinations = &number_of_combinations;
        ptr2_full_number = &full_number;
    
        // Aqui é necessário definir o valor de full_number antes de chamar a função generate_combinations()
    
        generate_combinations();
    
        // O resultado das combinações geradas pode ser acessado através de lotto_combs[] usando a fórmula lotto_combs[(i-1)*6+j]
    }
    #include <stdio.h>
    
    // Define global variables
    #define MAX_COMBS 51000000
    unsigned char lotto_combs[MAX_COMBS * 7];
    unsigned char *ptr2_lotto_combs = &lotto_combs[0];
    long number_of_combinations = 0;
    long *ptr2_number_of_combinations = &number_of_combinations;
    long full_number = 0;
    long *ptr2_full_number = &full_number;
    
    void generate_combinations() {
        __asm {
            mov ebx, 1         // i = 1
            mov ecx, [ptr2_lotto_combs]
            mov eax, [ptr2_number_of_combinations]
            mov edx, [ptr2_full_number]
            jmp start
    
        loop_i:
            inc ebx            // i++
            cmp ebx, [eax]     // if i > number_of_combinations, exit loop
            jg end_loop
    
        start:
            mov esi, ebx
            mov edi, ecx
    
        loop_j:
            mov [edi], esi
            inc edi
            shr esi, 8
            cmp edi, ecx + 6   // if j == 6, exit loop
            je end_j_loop
            jmp loop_j
    
        end_j_loop:
            inc [eax]          // increment number_of_combinations
            add ecx, 7         // increment lotto_combs pointer
            jmp loop_i
    
        end_loop:
        }
    }
    
    int main() {
        ptr2_lotto_combs = &lotto_combs[0];
        ptr2_number_of_combinations = &number_of_combinations;
        ptr2_full_number = &full_number;
    
        full_number = 49;     // set full_number to 49 (total number in pool)
        generate_combinations();
    
        // Test access to combinations
        printf("Combination 1, number 1: %d\n", lotto_combs[0] * 6 + 0);
        printf("Combination 1, number 2: %d\n", lotto_combs[0] * 6 + 1);
        printf("Combination 1, number 3: %d\n", lotto_combs[0] * 6 + 2);
        printf("Combination 1, number 4: %d\n", lotto_combs[0] * 6 + 3);
        printf("Combination 1, number 5: %d\n", lotto_combs[0] * 6 + 4);
        printf("Combination 1, number 6: %d\n", lotto_combs[0] * 6 + 5);
    
        printf("Combination 2, number 1: %d\n", lotto_combs[7] * 6 + 0);
        printf("Combination 2, number 2: %d\n", lotto_combs[7] * 6 + 1);
        printf("Combination 2, number 3: %d\n", lotto_combs[7] * 6 + 2);
        printf("Combination 2, number 4: %d\n", lotto_combs[7] * 6 + 3);
        printf("Combination 2, number 5: %d\n", lotto_combs[7] * 6 + 4);
        printf("Combination 2, number 6: %d\n", lotto_combs[7] * 6 + 5);
    
        return 0;
    }
    
    Note that the generated combinations

     

     

    • Like 1
  7. 1 minuto atrás, DixieJoe disse:

    A questão é saber se está correto e se funciona!

     

    a ia deu uma descrição completa antes disso ,
    dependendo de como se faz a pergunta e das informações que se apresenta ela até que é bem responsiva

    tipo aquele gerador de combinações assembly para pb
    ele deu uma descrição do que faz  o problema é que pedir para gfazer em C e ela fez em swift kkkk, eu nem tinha reparado até ler o nome
     

    • Like 1
  8. @DixieJoepo vc falou que nao gostou do gpt
    eu pedi a ele para converter um assembly daquele em c , pode até pedi uma explicação da funcionalidade

    "só nao sei se está falando a verdade kkkk"

     

    ; function LotIndex( Lot:LotMap ): LongInt; far;
    
    LotIndex PROC FAR Lot:DWORD
            PUBLIC LotIndex
            xor  eax, eax           ; Index := 0
            les  si, Triangle
            mov  ecx, Lot
    @@41:   jecxz @@44
    @@42:   shr  ecx, 1             ; Inc(x)
            jc   @@43               ; if x in ...
            add  si, 4              ; Inc(j)
            jmp  @@42
    @@43:   add  eax, es:[si]       ; Index := Index + ...
            add  si, 128            ; Inc(i)
            jmp  @@41
    @@44:   mov  edx, eax
            shr  edx, 16
            ret
    LotIndex ENDP
    Citar

    Sim, é possível converter o código assembly em uma função equivalente em C. A conversão depende da arquitetura do processador em que o código assembly será executado. Abaixo, segue um exemplo de como a função em assembly poderia ser escrita em C para a arquitetura x86:

    ong LotIndex(long Lot)
    {
        long Index = 0;
        char* Triangle = (char*)0x12345678; // endereço da variável Triangle
    
        while (Lot != 0)
        {
            if (Lot & 1)
            {
                Triangle += 4;
            }
            else
            {
                Index += *((int*)Triangle);
                Triangle += 128;
            }
            Lot >>= 1;
        }
    
        return (Index >> 16);
    }

    Neste exemplo, a função em C tem a mesma assinatura da função em assembly, com um parâmetro do tipo long e um valor de retorno do tipo long. A função usa uma variável Index para acumular o valor da soma e um ponteiro Triangle para apontar para a variável correspondente em memória. O endereço da variável Triangle foi definido como 0x12345678 como exemplo. É necessário alterar esse valor para o endereço correto da variável na memória.

    A lógica do loop em C é equivalente à do loop em assembly. A verificação de paridade de Lot é realizada usando o operador & para testar se o bit menos significativo é 1. A operação de deslocamento é realizada usando o operador >>. As operações de adição e incremento de ponteiro são realizadas usando os operadores + e +=. O tipo do ponteiro Triangle foi definido como char*, mas pode ser alterado para o tipo correto, dependendo da arquitetura e do tipo de dados armazenados na variável.

    Por fim, o valor retornado é obtido a partir do valor acumulado em Index e deslocado 16 bits para a direita, para obter a metade superior do valor.

     

    • Like 1
  9. 2 minutos atrás, Eolocos disse:

     

     

    assim, se quiser usar o Diagrama de Venn, que o @sorel gosta tanto, fica mais fácil:

     

    if ( $dezena ~ @array1 && $dezena ~ @array2 ) { push @array3, $dezena }

    troço complicado, quando sorel aparecer vc se vira com ele tá, mas se vc entende isso deve ser facil entender o sorel

    mas no caso acho que isso faz um força bruta testa dentro de um loop


    em vba eu faço algo como
    for c=1 to final
    if combinação(bit(c)) then cont=cont+1

    combinação seria uma matriz com o tamanho da loteria com cada dezena setada em sua posição

    mais ou menos isso
    mas procesadores tem instruções proprias de comparar e contar bit em um intenge
    eu uso isso para transformar a combinação em um inteiro

    Function combin_para_inteiro(matriz1 As Range) As Long
        Dim i As Long
        Dim num As Long
        arr1 = matriz1.Value2
        For i = 1 To UBound(arr1, 2)
            num = num + 2 ^ (arr1(1, i) - 1)
        Next i
        
        combin_para_inteiro = num
    End Function



     

     

    • Like 1
    • Haha 1
  10. 2 minutos atrás, DixieJoe disse:

    Mas, no momento, isso não é uma prioridade minha. Toma muito tempo e vai exigir mudanças grandes nas minhas rotinas.

     

    Depois que ganhar e tiver tempo sobrando, quem sabe, kkkk

    para mim tbm nao, só estou tentando aprender algo, e como vc sabe mesmo quando eu monto minhas coisas eu nao mexo com matrizes

    mas ve isso

    Citar
    tem como usar avx sse em Delphi?
     
     

    Sim, é possível usar instruções SIMD (Single Instruction, Multiple Data) como AVX e SSE em um programa Delphi usando as bibliotecas externas apropriadas. Existem várias bibliotecas disponíveis que oferecem suporte a instruções SIMD em Delphi, incluindo:

    Essas bibliotecas incluem rotinas otimizadas para operações comuns em vetores, como somas e produtos de ponto, usando instruções SIMD.

    Para usar essas bibliotecas, você precisa incluir os arquivos de cabeçalho e as bibliotecas dinâmicas fornecidas em seu projeto Delphi e usar as funções fornecidas em suas rotinas.

    Além disso, é importante notar que a capacidade de usar instruções SIMD depende do processador em que o código é executado. Nem todos os processadores suportam todas as instruções SIMD, e a detecção de recursos deve ser usada para garantir que as instruções adequadas estejam sendo usadas em cada plataforma.

     

    • Like 1
  11. 6 minutos atrás, DixieJoe disse:

    Ou separar em 2 pedaços de 64 bits e fazer a mesma coisa.

    vc pode separar em 4 pedaços de 32 bit,
    para falar a verdade acho que o avx e o sse fazem justamente isso, o avx trabalha com matrizes de 256bit e acho que tem até 512bit, mas isso dentro de uma matriz

    3 minutos atrás, Eolocos disse:

    mas o que é um bitcount ?

    bit count é justamente isso, contagem de bit
    imagina a lf como 15 bit =1 dentro de 25 bit

    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
    sseri igual a 1111111111111110000000000

    então seria contar os 1

    sde pode comparar um binario com outro com and por exempro e vai resultar em um binario que só tem os 1 que caem na mesma possiçao do outro

    • Like 1
  12. 4 minutos atrás, DixieJoe disse:

    Pra mim, não quero falar com o ChatGPT, kkkk.

     

    Achei esse código ai em cima, super complicado.

    Acho que temos coisa mais enxuta.

    mas aí que está, o gpt está mais para ajudar a entender como funciona
    dll s são super praticas de usar
    é a mesma coisa que uma função interna, só que ela está fora do programa principal , vc declara ela e a usa internamente

     

    mas a graça do gpt é que vc pode pegar exemplos de codigos
     

    8 minutos atrás, DixieJoe disse:

    Na verdade, só preciso mesmo de uma unica função em Assembly para contar bits, passados dois valores.

    E que pudesse aceitar valores até 100 (pensando na Lotomania).

    o fato é que existe varias maneira de fazer isso, e tbm dependo do seu processador o uso de certas instruções


    usando o gpt e o Delphi se pode pegar exemplos
    para lm vc pode dividir as seções em 32 bit e somar as contagens

     

    Spoiler

    preciso mesmo de uma unica função em Assembly para contar bits, passados dois valores. dentro de um codigo Delphi

    Citar

    Sim, é possível escrever uma função em assembly para contar o número de bits diferentes entre dois valores (também conhecido como distância de Hamming) em Delphi. Aqui está um exemplo de como fazer isso:

    program CountBits;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils;
    
    function CountBits(a, b: Integer): Integer;
    asm
      push ebp
      mov ebp, esp
      sub esp, 4
      xor eax, eax
      xor edx, edx
      mov ecx, 32
    
    @loop:
      cmp ecx, 0
      je @done
      mov ebx, a
      shr ebx, cl - 1
      and ebx, 1
      mov esi, b
      shr esi, cl - 1
      and esi, 1
      cmp ebx, esi
      jne @count
      jmp @next
    
    @count:
      inc eax
    
    @next:
      dec ecx
      jmp @loop
    
    @done:
      mov eax, [ebp - 4]
      add esp, 4
      pop ebp
    end;
    
    var
      a, b: Integer;
      bits: Integer;
    begin
      a := 12345;
      b := 67890;
      bits := CountBits(a, b);
      WriteLn('The number of different bits between ', a, ' and ', b, ' is ', bits);
      ReadLn;
    end.

    O código em Delphi define a função CountBits, que recebe dois parâmetros de entrada a e b, que são números inteiros, e retorna o número de bits diferentes entre esses dois números. A função é implementada em assembly e usa uma série de instruções lógicas para comparar os bits de cada número.

    A função usa um loop para comparar cada bit dos dois números. O loop começa com o valor 32 em ecx, que é o número de bits em um número inteiro de 32 bits. A cada iteração do loop, a função usa as instruções shr e and para obter o valor do bit atual de a e b, compara esses valores usando a instrução cmp e incrementa o contador de bits diferentes em eax, se os valores são diferentes. A função continua a percorrer os bits, decrementando ecx em cada iteração, até que todos os bits tenham sido comparados.

    Depois de contar o número de bits diferentes, a função coloca o valor em eax e retorna. O código em Delphi chama a função CountBits com dois valores de exemplo e imprime o resultado na tela.

     
     
     

    mas existe avx2, sse, que fornece instruções própria dentro do processador que são mais rapidas , mas dependem se o processador tem as instruções

    o metodo de tabela , contagem bit a bit

     

     

    • Like 1
  13. 6 minutos atrás, DixieJoe disse:

    Eu não estou gostando de usar o ChatGPT. Por enquanto, só tenho retornos que não ajudam muito.

     

    Vou esperar ele "evoluir".... kkkk

    bem, tem que aprender a falar com ele
    por exemplo, eu tive que mudar o pedido para ele gerar algo dentro dos parâmetros

     

    Citar
    o que eu quero é um codigo em assembly que gere todas as combinações de 15 numeros de 1 a 25 , mas no formato binario em inteiro, mas tem que estar dentro de uma função C
     
     

    Entendi. Aqui está um exemplo de código em assembly que gera todas as combinações de 15 números de 1 a 25 no formato binário em inteiro, dentro de uma função 😄

    #include <stdio.h>
    
    void generate_combinations(int* combinations) {
        __asm__(
            ".intel_syntax noprefix\n"
            "push rbp\n"
            "mov rbp, rsp\n"
            "sub rsp, 16\n"
            "mov QWORD PTR [rbp-8], rdi\n"
            "mov eax, 0\n"
            "mov ecx, 0\n"
            "mov edx, 15\n"
            "mov esi, 1\n"
            "mov edi, 1\n"
            "jmp .outer_loop\n"
    
        ".inner_loop:\n"
            "test esi, esi\n"
            "jle .outer_loop\n"
            "shl eax, 1\n"
            "mov ebx, DWORD PTR [rbp-4]\n"
            "add ebx, edi\n"
            "mov ebx, DWORD PTR [rbx]\n"
            "cmp ebx, 25\n"
            "jg .next\n"
            "inc eax\n"
            "mov ebx, DWORD PTR [rbp-4]\n"
            "add ebx, edi\n"
            "mov ecx, DWORD PTR [rbp-8]\n"
            "mov edx, eax\n"
            "add ecx, edx\n"
            "mov DWORD PTR [ecx*4], ebx\n"
            "inc edi\n"
            "dec esi\n"
            "jmp .inner_loop\n"
    
        ".next:\n"
            "inc edi\n"
            "mov ebx, DWORD PTR [rbp-4]\n"
            "add ebx, edi\n"
            "cmp ebx, DWORD PTR [rbp+8]\n"
            "jg .done\n"
            "jmp .outer_loop\n"
    
        ".outer_loop:\n"
            "cmp edx, 0\n"
            "jle .done\n"
            "mov esi, edx\n"
            "mov eax, 0\n"
            "mov edi, 1\n"
            "jmp .inner_loop\n"
    
        ".done:\n"
            "add rsp, 16\n"
            "pop rbp\n"
            ".att_syntax prefix\n"
        );
    }
    
    int main() {
        int combinations[15];
        generate_combinations(combinations);
        for (int i = 0; i < 15; i++) {
            printf("%d ", combinations[i]);
        }
        printf("\n");
        return 0;
    }

     

    O código acima implementa a função generate_combinations em assembly, que recebe um ponteiro para um array de 15 inteiros e preenche esse array com todas as combinações de 15 números de 1 a 25 no formato binário em inteiro. O código em C chama essa função e imprime o resultado na tela.

    O código em assembly usa dois loops aninhados para gerar as combinações. O loop externo controla o número de elementos na combinação, que começa em 15 e vai decrescendo até 1. O loop interno adiciona cada elemento à combinação e avança para o próximo elemento. O loop interno usa a instrução shl para deslocar o valor atual da combinação uma posição para a esquerda e a instrução mov para carregar o próximo elemento do array de números. Se o próximo elemento for maior que 25, o loop inter

     

    • Like 1
  14. só  tem que tomar cuidado com o gpt pq as vezes ele gera umas respostas nada a ver,

    tipo eu pedi isso:

    Citar

    voce consegue criar um codigo assembly para ser usado em no C que gere todas as combinações de 15 numeros de 1 a 25?

    e ele fez isso

    section .data
    num_array: db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25
    comb_array: times 15 db 0
    
    section .text
    global generate_combinations
    
    generate_combinations:
        mov rdi, comb_array
        mov rsi, 15
        call generate_combinations_recursive
        ret
    
    generate_combinations_recursive:
        push rbp
        mov rbp, rsp
        sub rsp, 32
        
        mov rcx, [rbp + 8] ; número de elementos a serem escolhidos
        cmp rcx, 0
        je .end
        
        mov rdx, [rbp + 16] ; ponteiro para o array de combinações atual
        mov r8, num_array
        mov r9, [rbp + 24] ; tamanho do array de números possíveis
        mov rax, 0 ; índice do número atual
        
    .next_num:
        cmp rax, r9
        jge .end_loop
        movzx ecx, byte [r8 + rax] ; número atual
        movzx edx, byte [rdx + rcx * 1] ; valor já escolhido
        cmp edx, 0
        jne .next_num_loop ; número já foi escolhido
        mov byte [rdx + rcx * 1], cl ; adiciona número atual à combinação
        mov rcx, rcx - 1 ; decrementa contador
        call generate_combinations_recursive ; recursão
        mov byte [rdx + rcx * 1], 0 ; remove número atual da combinação
        add rcx, 1 ; incrementa contador
    .next_num_loop:
        add rax, 1 ; incrementa índice
        jmp .next_num
    .end_loop:
        leave
        ret
        
    .end:
        leave
        ret

    acho que isso é vbnet kkkkk
    mas aí é só pedi para gerar novametne

     

    • Like 1
  15. 7 minutos atrás, DixieJoe disse:

    Quem dominar C ou Assembly (seria mais rápido ainda se feito em Assembly) e conseguir integrar essa função (seja em planilha, DLL ou noutra linguagem) vai ter progamas super rápidos para estudar e montar jogos.

     

    Vale muito a pena aprender o básico com bits para criar funções e DLLs, com certeza.

    nao sei programar em c, nisso o chat gpt tá fazendo o trabalho, sabendo o basico da programação dá para pegar oq ela faz e montar algo completo
    a ia tbm faz em outras linguagens, talvez possa te ajudar a melhorar seus codigos te dando exemplos para instruções focadas em avx, sse , mult processamento

    a ia é uma ajuda e tanto

    • Like 1
  16. alguem sabe me dizer se isso está certo?

     
    Citar

     

    qual o valor maximo de um int de 32 bit que tenha 15 bit setado?
     
     
     

    Um inteiro de 32 bits com 15 bits definidos como 1 tem 17 bits restantes que podem ser definidos como 0 ou 1.

    O valor máximo que um inteiro de 32 bits pode representar é (2^32) - 1, que é 4294967295 em decimal.

    Para calcular o valor máximo que um inteiro de 32 bits com 15 bits definidos como 1 pode ter, podemos considerar que os 15 bits definidos como 1 devem estar nas posições mais significativas.

    Assim, o valor máximo que um inteiro de 32 bits com 15 bits definidos como 1 pode ter é:

    (1 << 15) - 1) << 17 + (1 << 17) - 1

    Isso pode ser simplificado para:

    4294705151

    Portanto, o valor máximo de um inteiro de 32 bits com 15 bits definidos como 1 é 4294705151 em decimal.

     

    Citar
    de 25 bit e 15 bit setados ?
     
     

    Da mesma forma que no caso anterior, um inteiro de 25 bits com 15 bits definidos como 1 tem 10 bits restantes que podem ser definidos como 0 ou 1.

    O valor máximo que um inteiro de 25 bits pode representar é (2^25) - 1, que é 33554431 em decimal.

    Para calcular o valor máximo que um inteiro de 25 bits com 15 bits definidos como 1 pode ter, podemos considerar que os 15 bits definidos como 1 devem estar nas posições mais significativas.

    Assim, o valor máximo que um inteiro de 25 bits com 15 bits definidos como 1 pode ter é:

    (1 << 15) - 1) << 10 + (1 << 10) - 1

    Isso pode ser simplificado para:

    65407

    Portanto, o valor máximo de um inteiro de 25 bits com 15 bits definidos como 1 é 65407 em decimal.

     

    o ruim do gpt é que quando a gente nao sabe muito sobre o assunto ficamos sem saber se a ia está nos trollando

    queria ver se tem como definir um codigo para gerar só os inteiros ou binários que tenham 15 bit setados, para fazer um conferidor de matrizes


     

    • Like 1
  17. o legal do chat gept é que vc tem a resposta gerada para a pergunta que voce faz

    então fica mais facil voce entender e aprender
    quando se faz busca pela internet a gente tem que ficar filtrando as paginas para ver se realmente fala sobre o assunto pesquisado, tem que filtrar os que tem uma linguagem que voce entenda, tem que filtrar se a informação é realmente relevante

     

    acho que para evitar tretar o gpt tinha que parar ficar fazer trabalhos completos, se for só uma ferramenta de pesquisa e estudo é muito bem vindo

    • Like 1
  18. 2 minutos atrás, Sphgf disse:

     

    Olá, pesquisando o site askjarvis mudou para:

    https://www.askcodi.com/

     

    Sds,

    Sphgf

    sim, mas a questão continua a mesma, como eles ficam ?
    afinal o gpt é muito melhor, nao só te entrega um codigo que vc tem qu saber como montar, vc pode bater um papo com ele trocando ideias pedindo opiniões e pedir a ele para montar um codigo até misturando linguagens com a ideia que foi discutida
    esse outro mesmo para descrever o codigo que vc sabe fica dificil

  19. queria saber como fica a askjarvis com o surgimento do chatgpt que ao meu ver é bem melhore com menos limitações

     

    mas mesmo assim , isso de programar em C é cheio de complicações

    instalei o compilador, instalei umas 2 ide para ver se facilita
    isso com a ajuda do gpt que apesar de as vezes dar uns furos ainda ajuda legal

    mas e para ter o codigo compilado em exe ou dll?
    o treco compila faz os testes mas cade a merda do programa compilado?

    com o gpt eu posso ter exemplos de codigos do que eu quero montar e modificar , mas essa complicação de ter o programa em mãos é osso

    • Thanks 1
×
×
  • Create New...