Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1

    [C] lavorare sui bits

    Salve,
    sto' cercando di scrivere un programmino ma purtroppo mi ritrovo con questa difficolta':
    non riesco a trovare il modo per scrivere/modificare singoli bit all'interno di un blocco di memoria allocato con malloc().
    Riporto quanto fatto:
    Codice PHP:
      #include <stdlib.h>
    #include <stdio.h>

    main () {
    // funzione per stampare i bits di un intero
      
    void printbits(unsigned x){
        if (
    x==0printf("0");
        else 
    printbits(x>>1);
          
    printf("%d",x&1);
      }

    /* bitcount: count 1 bits in x */
    int bitcount(unsigned x)
    {
        
    int b;
        for (
    0!= 0>>= 1)
            
    b++;
        return 
    b;
    }

    // Funzione per settare ad 1 tutti i bit dell'intero passato come argomento
    int setbitOn(int x)
    {
     for (; 
    != 0>>= 1
        
    1;
        return 
    x;
    }

      
    int  *A;
      
    = (int *) malloc(20);
      
    printf("Garbage Contents: %d %d\n"Asizeof(A) );
      
    printf("Bits di A: ");
      
    printbits(A);            //stampa 0
      
    printf("\n");
      
    printf("Numero di bits in A: %d\n",bitcount(A));   //stampa 28!!
      
    printf("Bits di A dopo setbitOn(): ");
      
    printbits(setbitOn(A));
      
    printf("\n");
      
    printf("Garbage Contents(2): %d %d\n"Asizeof(A) );
      
    printf("\n");
      
    free(A);

    Il problema e' nella funzione setbitOn() che dovrebbe mettere ad 1 tutti i bit del blocco passato, ma che in realta' sembra non fare nulla!
    Un altra cosa, ma se io ho allocato un blocco di memoria da 20 bytes puntato da *A, come e' possibile che quando vado a contare i bits contenuti in A ottengo 28??...non dovrei ottenere 160 bits??

    Grazie mille!!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    1) Ma come e' combinato il main? Hai mai compilato questo codice?

    2) Cosa dovrebbe fare la bitcount? E sei sicuro che faccia quello che credi?

    3) Passi sempre A alle funzioni (A e' un puntatore) ma le funzioni NON accettano un puntatore ...

  3. #3
    Originariamente inviato da oregon
    1) Ma come e' combinato il main? Hai mai compilato questo codice?
    OOpps sistemo il tutto...ho fatto copia e incolla delle parti interessate ed ovviamente ho pasticciato un pò...

    2) Cosa dovrebbe fare la bitcount?
    Contare di quanti bits è composto l'oggetto che passo

    2) E sei sicuro che faccia quello che credi?
    Penso di si, l'ho presa dal Kernighan & Ritchie

    3) Passi sempre A alle funzioni (A e' un puntatore) ma le funzioni NON accettano un puntatore ...
    Ok, ma facendo così ottengo un risultato pur con warning nella compilazione, passando *A invece non mi da warning ma non ottengo la scrittura dei bits in out..


    Codice PHP:
    #include <stdlib.h>
    #include <stdio.h>

    // funzione per stampare i bits di un intero
      
    void printbits(unsigned x){
        if (
    x==0printf("0");
        else 
    printbits(x>>1);
          
    printf("%d",x&1);
      }

    /* bitcount: count 1 bits in x */
    int bitcount(unsigned x)
    {
        
    int b;
        for (
    0!= 0>>= 1)
            
    b++;
        return 
    b;
    }

    // Funzione per settare ad 1 tutti i bit dell'intero passato come argomento
    int setbitOn(int x)
    {
    for (; 
    != 0>>= 1)
        
    1;
        return 
    x;
    }

    main () {
      
    int  *A;
      
    = (int *) malloc(20);
      
    printf("Garbage Contents: %d %d\n"Asizeof(A) );
      
    printf("Bits di A: ");
      
    printbits(A);            //stampa 0
      
    printf("\n");
      
    printf("Numero di bits in A: %d\n",bitcount(A));   //stampa 28!!
      
    printf("Bits di A dopo setbitOn(): ");
      
    printbits(setbitOn(A));
      
    printf("\n");
      
    printf("Garbage Contents(2): %d %d\n"Asizeof(A) );
      
    printf("\n");
      
    free(A);


  4. #4
    Dal K&R ho trovato questa:

    /* bitcount: count 1 bits in x */
    int bitcount(unsigned x)
    {
    int b;
    for (b = 0; x != 0; x >>= 1)
    if (x & 01)
    b++;
    return b;
    }

    che ritorna il numero di bits uguali ad 1, io ho solo tolto l'IF per fargli contare anche quelli a 0,
    ho provato e sembra funzionare...

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da TommyGun
    /* bitcount: count 1 bits in x */
    int bitcount(unsigned x)
    {
    int b;
    for (b = 0; x != 0; x >>= 1)
    b++;
    return b;
    }
    Questa è completamente "ravanata" .... sai cosa fa?? Incrementa 'b' finché x è diverso da 0 e intanto shifta a destra x. E allora??
    Vuoi contare quanti bit in totale ci sono in una variabile?? Allora sizeof(variabile)*8
    Vuoi contare quanti bit a '1' ci sono in una variabile?? Allora devi modificare la funzione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da TommyGun
    che ritorna il numero di bits uguali ad 1, io ho solo tolto l'IF per fargli contare anche quelli a 0,
    Ma che vuoi dire?

    In un byte ci sono 8 bit ... che bisogno hai di contare quelli a 1 e quelli a 0? Sempre 8 sono!

    Quindi (vedi andbin) fai semplicemente 8 * il numero di byte in un dato (che praticamente e' il sizeof del dato).

    Se hai un intero a 4 byte, allora sizeof sara' uguale a 4 e 4*8 uguale 32 bit ... fine ...

  7. #7
    eh già la countbits() è completamente sballata...
    scusate ma pensavo di averla vista bene, invece...
    Vi ringrazio per i vostri chiarimenti.

    ma qualche dritta per settare tutti i bit di A ad 1?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Guarda che A e' un puntatore ... se setti tutti i bit di A, modifichi il valore del puntatore!

    Se invece parli dei "byte puntati da A", quindi i 20 byte di cui alla malloc, allora semplicemente fai un ciclo da 0 a 19 e poni i singoli byte uguali a 0xFF.

    codice:
    for(i=0; i<20; i++)
      A[i] = 0xFF;

  9. #9
    Ok provo.
    Quindi è per questo motivo che una cosa del genere:

    int setbitOn(int x)
    {
    for (; x == 1; x >>= 1)
    x = x | 1;
    return x;
    }

    non funziona?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quella non funziona perche' non ha senso ... prova a spiegarti passo passo cosa fa quella funzione ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.