Operazioni bit a bit

di il
12 risposte

Operazioni bit a bit

Salve raga sto tentando di capire bene le operazioni bit a bit shift or e and escusivamente bit a bit, ed ho pensato come mio primo programma di controllare se un numero è pari oppure no usando l'and bit a bit ragionando sul fatto che qualsiasi numero pari ha la cifra meno significativa a 0 ma il mio programma non si comporta come si deve vi lascio il codice:




#include <stdio.h>

int main(int argc, const char * argv[])
{
    int num;
    
    
    for(num=0;num<100;num++){
        
        if(num&2){  // controllo se è pari vedendo se l'ultima cifra in binario corrisponde a 0 
            printf("%d\n",num);}
    
}
    
}

12 Risposte

  • Re: Operazioni bit a bit

    La if è sbagliata ... deve essere

    if(!(num & 1))

    a te capire il perché
  • Re: Operazioni bit a bit

    Vediamo se ho capito bene in and con uno perché così prendo l'ultima cifra meno significativa , la metto in and con 1 quindi se l'ultima cifra è 1 l'and dirà 1 altrimenti mi dirà 0, ma questo valore per l'if è falso quindi metti ! da 0


    esempio 000 101
    000 001
    and dirà 1
    000 0010
    000 0001

    l'and dirà 0
    0 è un valore falso quindi lo pongo ! da 0


    giusto??
  • Re: Operazioni bit a bit

    Forse adesso ragionando ancora ho capito il tuo !(num&1) mi fai calcolare la condizione ricordando sempre che and dirà 0 se il numero è pari (0 per l'ifa è falso) quindi dopo calcolata la condizione la nego (da 0 lo faccio passare a 1 momentaneamente) 1 per l'if è vero quindi il numero esaminato è pari stessa cosa per i dispari
  • Re: Operazioni bit a bit

    Bisogna ragionare in bit e quindi prendiamo ad esempio un numero pari e uno dispari:
    00010010
    00010011
    ora eseguiamo l'and a uno
    00010010 & 00000001 = 00000000
    00010011 & 00000001 = 00000001
    quindi avremo 0 per pari e uno per dispari quindi se vogliamo che l'if esca per pari lo neghiamo:
    al posto di usare la negazione piu semplicemente si potrebbe uscire cosi:
    
        int a=11;
    
        if ((a & 1)==0)
            printf("Pari");
        else
            printf("dispari");
    
    anche se nulla vieta:
    
        int a=10;
    
        if (a & 1)
            printf("Dispari");
        else
            printf("Pari");
    
  • Re: Operazioni bit a bit

    Sisi ero riuscito a capirlo grazie per la conferma... visto che non ne trovo potresti suggerirmi qualche bel esercizio da fare usando 1 or bit a bit oppure 1 and bit a bit?? esempio ho scoperto che se scifto a destra di 1 bit ottengo sempre la metà del numero stesso se è pari oppure la metà esclusa la parte decimale se è dispari
  • Re: Operazioni bit a bit

    Anche se shifti un numero decimale, a destra o sinistra, ottieni il valore diviso o moltiplicato per la base (10).

    Studia qualcosa sui "sistemi di numerazione posizionali".
  • Re: Operazioni bit a bit

    Sisi è ovvio perché è come se moltiplicassi e dividessi per potenze di 2 ergo succede la stessa cosa di quando moltichi o dividi per 10
  • Re: Operazioni bit a bit

    Non mi è chiara una cosa se devo vededere se per esempio un numero è divisibile per 3 bit a bit io avevo pensato di applicare una maschera ma il mio programma non va bene comunque la mia intenzione era:


    0000 00101
    0000 00011
    --------------
    0000 00001 (1 negato =0 if falso e si trova)



    0000 01001(9 in binario)
    0000 00011(3 in binario)
    --------------
    0000 00001 (negandolo diventa 0 errato !!)
  • Re: Operazioni bit a bit

    No ... non puoi farlo ...
  • Re: Operazioni bit a bit

    Quindi posso controllare solo se un numero è pari o dispari??? ma io sono riuscito a vedere anche i multipli di 4 con questo giochetto mettendolo in and con 3 notando che i multipli di 4 hanno gli ultimi due bit a 0 3 ha i due bit a 1 e sono riuscito facilmente a farlo
  • Re: Operazioni bit a bit

    Puoi lavorare con le potenze della base utilizzata (quindi potenze di 2).

    4 è una potenza di 2, ma 3 non lo è.
  • Re: Operazioni bit a bit

    Ah oki grazie tante!
Devi accedere o registrarti per scrivere nel forum
12 risposte