Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C/C++] operatore AND bitwise (&)

    Salve a tutti,

    sto studiando gli operatori bitwise e ho subito alcuni dubbi che non riesco a risolvere (tra google e prove)!!
    Sul mio libro è presente la seguente descrizione dell'operatore AND bitwise: i bit del risultato sono impostati a 1, se quelli corrispondenti dei due operandi sono entrambi 1.
    Fin qui, sembra tutto chiaro.
    Poi il testo fa il seguente esempio:

    codice:
     /*  Printing an unsigned integer in bits */
    
    #include <stdio.h>
    
    
    
    void displayBits( unsigned value ); /* prototype */
    
    
    
    int main( void )
    
    { 
    
       unsigned x; /* variable to hold user input */
    
    
    
       printf( "Enter an unsigned integer: " );
    
       scanf( "%u", &x );
    
    
    
       displayBits( x );
    
       
    
       return 0; /* indicates successful termination */
    
    
    
    } /* end main */
    
    
    
    /* display bits of an unsigned integer value */
    
    void displayBits( unsigned value )
    
    { 
    
       unsigned c; /* counter */
    
    
    
       /* define displayMask and left shift 31 bits */
    
       unsigned displayMask = 1 << 31; 
    
    
    
       printf( "%10u = ", value );
    
    
    
       /* loop through bits */ 
    
       for ( c = 1; c <= 32; c++ ) { 
    
          putchar( value & displayMask ? '1' : '0' );
    
    		printf("%d\n", value & displayMask);
    
    
          value <<= 1; /* shift value left by 1 */   
    
    
    
          if ( c % 8 == 0 ) { /* output space after 8 bits */
    
             putchar( ' ' );
    
          } /* end if */
    
    
    
       } /* end for */
    
    
    
       putchar( '\n' );
    
    } /* end function displayBits */
    Come esempio viene inserito il numero 65000 e il programma da il seguente risultato:

    00000000 00000000 11111101 11101000

    che effettivamente corrisponde a 65000 scritto in binario.

    Ecco i miei dubbi.
    value rappresenta la sequenza di bit:
    10000000 00000000 00000000 00000000
    che corrisponde al numero 2^31 = 2147483648

    quando value viene confrontato con un altro numero attraverso l'AND bitwise, il risultato sarà
    00000000 00000000 00000000 00000000 ossia 0
    oppure
    10000000 00000000 00000000 00000000 ossia 2^31 = 2147483648

    dato che 2^31 > 0, esso viene valutato come VERO e un uno viene stampato.
    Fin qui è corretto quello che ho detto?

    La cosa strana è che se faccio printf("%d\n", value & displayMask); all'interno del loop for ottengo una lista di due output:
    00 e
    1-2147483648

    Come mai c'è "1-" davanti al numero che mi aspetto?
    Altra domanda: non c'è un modo più semplice (diretto) per stampare i bit di un numero?

    Grazie a tutti!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Ciao,

    %d nella printf stampa un intero con segno e, visto che il primo bit è 1 allora ti stmpa il numero negativo. Prova con %u.

  3. #3
    Originariamente inviato da jobv
    %d nella printf stampa un intero con segno e, visto che il primo bit è 1 allora ti stmpa il numero negativo. Prova con %u.
    Effettivamente non stampa il numero negativo... anche se quando mettevo %d non solo mi stampava il segno meno, ma anche il numero "1"... che vuol dire questo "1"?

    Com'è la storia dei numeri negativi che iniziano con 1?

    Poi, qualcuno sa un modo più diretto per stampare i bit di un numero, senza dover eseguire la funzione descritta sopra?


  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da ginetto79
    Effettivamente non stampa il numero negativo... anche se quando mettevo %d non solo mi stampava il segno meno, ma anche il numero "1"... che vuol dire questo "1"?
    Com'è la storia dei numeri negativi che iniziano con 1?
    Poi, qualcuno sa un modo più diretto per stampare i bit di un numero, senza dover eseguire la funzione descritta sopra?
    Nella rappresentazione dei numeri binari, esiste un bit che è riservato al segno, vale 0 se il numero è positivo e 1 se è negativo

  5. #5
    Originariamente inviato da simo_85
    Nella rappresentazione dei numeri binari, esiste un bit che è riservato al segno, vale 0 se il numero è positivo e 1 se è negativo
    Intendi l'1 che viene stampato o il primo 1 della cifra binaria?

    In ogni caso, se l'1 di 10000000 00000000 00000000 00000000 indica il segno negativo, esso indica anche che stiamo parlando della cifra 2147483648... non mi sembra molto logico. Allora come indicare +2147483648?

  6. #6
    Originariamente inviato da ginetto79
    Allora come indicare +2147483648?
    Infatti non lo puoi indicare; il range di un intero con segno a 32 bit è [-2147483648, +2147483647].
    Leggi qui.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da ginetto79
    Intendi l'1 che viene stampato o il primo 1 della cifra binaria?
    In questo caso si fa sempre riferimento al MSB.
    In ogni caso, se l'1 di 10000000 00000000 00000000 00000000 indica il segno negativo...
    Per la rappresentazione dei numeri negativi si usa il complemento a 2.

  8. #8
    Diciamo che la stessa sequenza di bit verrà intepretata in modo diverso se la leggo come un numero signed o unsigned, giusto?

    Ma possibile che non esiste un modo più diretto per andare a vedere con quali bit un numero è memorizzato? Non so, andare nella locazione di memoria dove è memorizzato il numero e leggere i bit...
    Devo per forza ricorrere a una stratagemma come la funzione precedente per stampare questi bit?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Si. Il modo migliore secondo me è tenersi a mente questo
    codice:
    
    0	0x0	0000
    1	0x1	0001
    2	0x2	0010
    3	0x3	0011
    4	0x4	0100
    5	0x5	0101
    6	0x6	0110
    7	0x7	0111
    8	0x8	1000
    9	0x9	1001
    10	0xa	1010
    11	0xb	1011
    12	0xc	1100
    13	0xd	1101
    14	0xe	1110
    15	0xf	1111
    

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.