Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - leggere i bit in memoria in C
Forum - C/C++ - leggere i bit in memoria in C

Avatar
Carlo (Member)
Guru


Messaggi: 798
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 23:03
Domenica, 13/12/2020
In C mi sembra che non ci sia una funzione specifica per leggere i bit di una locazione RAM.
Si potrebbe leggere un byte e poi convertirlo, ma sto sperimentando e una semplice conversione non è quello che cerco, con le mie modeste conoscenze ho realizzato:
Codice sorgente - presumibilmente C/C++

  1. uint16_t INT16 = 0xCCCC;
  2.  
  3.     for (i=0; i<16; i++)
  4.         if (((uint8_t)(INT16>>i) & 1)==0) // bit a bit
  5.             printf("0");
  6.         else
  7.             printf("1");


il codice sembra funzionare, non mi piace l'if, partendo dall'indirizzo di memoria di INT16, faccio l'and binario con 00000001 tutti i bit verranno azzerati solo il primo bit a destra attiva il controllo per decidere se è 1 o 0 e poi scorro di un bit fino ad arrivare alla fine.
In ambiente win (little endian) i bit mi escono da destra verso sinistra.
così stampo i bit dritti
Codice sorgente - presumibilmente C/C++

  1. uint16_t INT16 = 0xCCCC;
  2.  
  3.     for (i=16; i>0; --i)
  4.         if (((uint8_t)(INT16>>i-1) & 1)==0) // bit a bit
  5.             printf("0");
  6.         else
  7.             printf("1");



La domanda: come si dovrebbe fare meglio di così in C?

Ultima modifica effettuata da Carlo il 14/12/2020 alle 15:48


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6117
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:26
Lunedì, 14/12/2020
Codice sorgente - presumibilmente C/C++

  1. for (int i = 15; i+1; i--)
  2.    printf("%c", ((INT16 >> i) & 1) + '0');



o anche

Codice sorgente - presumibilmente C/C++

  1. for (int i = 0x8000; i; i>>=1)
  2.    printf("%c", INT16 & i ? '1' : '0');


Ultima modifica effettuata da nessuno il 14/12/2020 alle 22:39


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 798
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 14:24
Martedì, 15/12/2020
Testo quotato

Postato originariamente da nessuno:

Codice sorgente - presumibilmente C/C++

  1. for (int i = 15; i+1; i--)
  2.    printf("%c", ((INT16 >> i) & 1) + '0');



Bello, ci potevo arrivare anche da solo, la mente non è più sveglia come una volta...

Testo quotato

Postato originariamente da nessuno:
o anche

Codice sorgente - presumibilmente C/C++

  1. for (int i = 0x8000; i; i>>=1)
  2.    printf("%c", INT16 & i ? '1' : '0');



Non ci avrei mai pensato, l'operatore ternario sul printf è chiaro,  il for impostato così mi crea difficoltà, dovrei provare con il debug, questo è quello che leggo: (int i = 0x8000 (valore iniziale di i); i (>0 è sottointeso);  i>>=1 (shift a destra e assegna))
Vado per ragionamento, il valore binario di 0x8000 è: 1000000000000000 con i>>=1, sposti l'uno di un posto verso destra usi i per mascherare il bit voluto (solo zero è false) e il ciclo continua finquando l'uno scompare, a quel punto i non è più maggiore di zero, e il ciclo finisce.
In questo modo lavori direttamente sui bit senza dover fare nessuna conversione:heehee:

Ultima modifica effettuata da Carlo il 15/12/2020 alle 14:46


in programmazione tutto è permesso
PM Quote