Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C] aiuto sui bitwise

  1. #1

    [C] aiuto sui bitwise

    ciao a tutti!
    Chiedo aiuto su un programma che utilizza i bitwise, vi posto il codice

    codice:
    /* Il programma visualizzerà un intero unsigned nella sua rappresentazio
     * ne binaria, suddividendola in gruppi di otto bit. */
     
    #include <stdio.h>
    
    void displayBits( unsigned value );
    
    int main()
    {
    	unsigned x; // variabile destinata a contenere l'input dell'utente
    	
    	printf("Inserisci un intero unsigned: ");
    	scanf("%u", &x);
    	
    	displayBits(x);
    	
    	return 0;
    }
    
    // Visualizza i bit di un valore intero senza segno
    void displayBits( unsigned value )
    {
    	unsigned c;	// contatore
    	
    	//dichiara dispalyMask ed esegue uno scorrimento a sinistra di 31bit
    	unsigned displayMask = 1 << 31;
    	
    	printf("%10u = ", value);
    	
    	// itera scorrendo i bit
    	for ( c=1; c <= 32; c++ ) {
    		putchar(value & displayMask ? '1' : '0');
    		value <<= 1;	// esegue scorrimento a sinistra di 1 su value
    		
    		// manda in output uno spazio dopo 8 bit
    		if ( c % 8 == 0 ) {
    			putchar(' ');
    		}
    		
    	}
    	
    	putchar('\n');
    }
    Quello che non capisco è a cosa serve la variabile displayMask impostata come 1 << 31. Ho letto che serve come mascheramento ma non capisco la sua utilità
    L'istruzione putchar(value & displayMask ? '1' : '0'); confronta i valori binari di value e di displayMask e dovrebbe restituire 1 se i bit a confronto sono entrambi impostati a 1 e 0 se sono diversi tra loro; ma in questo caso dovrebbe stampare solo zeri in quanto la variabile displayMask, spostando tutti i bit a sinistra di 32 posizioni, contiene solo zeri?
    Quindi come fà a stamparmi un numero in binario?
    Spero che mi possiate dare una mano

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    un unsigned int ha 32 bit, 1<<31 setta a 1 il bit più alto:
    10000000 00000000 00000000 00000000
    Confrontando questa "maschera" con un quasiasi numero con & si controlla se il bit più alto è settato:
    10000000 00000000 00000000 00000000
    &
    10100000 00001100 01001000 00011100
    -----------------------------------------------
    10000000 00000000 00000000 00000000

    10000000 00000000 00000000 00000000
    &
    00100010 00001100 01001000 00011100
    -----------------------------------------------
    00000000 00000000 00000000 00000000

    Con questo meccanismo si controlla il primo bit e si stampa 1 o 0 a seconda del suo valore, value<<=1 ad ogni ciclo sposta a sinistra i valori per cui un numero quale:
    1) 10100000 00001100 01001000 00011100
    2) 01000000 00011000 10010000 00111000
    3) 10000000 00110001 00100000 01110000
    ...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    il fatto è che non capisco come value diventa binario

    quando uso l'operatore & value viene trasformato direttamente in binario?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Tutto in informatica è codificato in binario.

    Gli operatori bitwise ti permettono di manipolare i bit che compongono qualunque cosa (interi, caratteri, byte, short, long, double, ecc..)

    1 byte è codificato come una sequenza di 8 bit
    1 int è codificato tramite 4 byte --> una sequenza di 32 bit
    1 double è codificato tramite 8 byte --> una sequenza di 64 bit
    ...

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Originariamente inviato da edoedo91
    il fatto è che non capisco come value diventa binario

    quando uso l'operatore & value viene trasformato direttamente in binario?
    La base non è una proprietà intrinseca del numero né della variabile, non è importante come è memorizzato, la base è una proprietà della sua rappresentazione.
    In questo caso devi solo sapere che gli operatori bit a bit trattano i numeri come se fossero in base 2.

  6. #6
    ok perfetto,
    adesso vorrei capire bene il procedimento, vi faccio un esempio ditemi se è corretto

    10000000 00000000 00000000 00000000 (displayMask)
    00000000 00000000 11111101 11101000 (value)

    da quanto ho capito il programma fa questo:
    - ad ogni ciclo confronta il primo bit significativo di displayMask con il primo bit di value

    quindi per c=1
    10000000 00000000 00000000 00000000 (displayMask)
    00000000 00000000 11111101 11101000 (value)

    confronta i primi bit significativi e stampa 0
    scorre value << 1
    ______________________________________________

    per c=2
    10000000 00000000 00000000 00000000 (displayMask)
    00000000 00000001 11111011 11010000 (value)

    confronta i primi bit significativi e stampa 00 (solo il primo bit a sinistra, il resto sono i bit stampati in precedenza)
    scorre value << 1
    ______________________________________________

    per c=17
    10000000 00000000 00000000 00000000 (displayMask)
    11111101 11101000 00000000 00000000 (value)

    confronta i primi bit significativi e stampa 1 00000000 00000000
    scorre value << 1
    ______________________________________________

    è così? se si ma il numero non viene capovolto?
    Se ho sbagliato vi prego, fatemi un esempio simile

    Ps: grazie per l'aiuto

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Originariamente inviato da edoedo91
    confronta i primi bit significativi e stampa 00 (solo il primo bit a sinistra, il resto sono i bit stampati in precedenza)
    La stampa della cifra successiva viene fatta a destra non a sinistra


    Originariamente inviato da Scara95
    http://en.wikipedia.org/wiki/Endianness
    Non centra l'ordine dei bytes

  9. #9
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Originariamente inviato da edoedo91
    è così? se si ma il numero non viene capovolto?
    Se ho sbagliato vi prego, fatemi un esempio simile

    Ps: grazie per l'aiuto
    In che senso non viene capovolto?
    L' and logico l' hai capito?

  10. #10
    La stampa della cifra successiva viene fatta a destra non a sinistra
    non me ne ero accorto


    Grazie a tutti per l'aiuto!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.