Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-06-2008, 11:47   #1
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
[C/C++] Operazioni su una stringa di bits...

Salve,
volevo accompagnare la tesina (si sono in ritardo bestia ) con una simpatica demo, dato che tutti portano powerpoint e io non mi sentivo da meno

Cmq apparte ciò, ho sviluppato un programmino bastanza semplice che simula l'evoluzione di "bestie", che vengono generate proceduralmente a partire da una stringa di bits, la quale viene modificata per delezione o modifica o crossover secondo lo standard degli algoritmi genetici.

Solo che qui mi perdo: come fare per modificare UN bit per volta, oppure per toglierne uno e far scorrere tutti gli altri, su un array lungo N?
Sono completamente a digiuno di operazioni bitwise

Avevo anche pensato di usare una sequenza di char con valori fra 0 e 3, come in natura, ma poi non saprei come creare un numero decimale partendo da base 4...

Grazie per l'aiuto!

EDIT: Prego un moderatore qualsiasi di aggiungere la tag [C/C++], poichè l'ho dimenticata...
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 27-06-2008 alle 13:50.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 13:54   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Uhm, temo che i moderatori ti chiuderanno il thread...

Non hai specificato il linguaggio che usi, né ho capito bene cosa intendi fare di preciso: se devi prelevare un solo bit alla volta, un qualsiasi intero è sufficiente, potrai estrarre l'ultimo bit con (numero & 1) e farlo scorrere verso destra (uno shift che ti elimina l'ultimo bit) con numero >>= 1 (il tutto, nella sintassi del C, poi dipende dal tuo linguaggio).
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:01   #3
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Eh lo so mi sono scordato la tag e l'ho ricordata quando era troppo tardi...

Il linguaggio è C++, quindi C va benissimo.

Mettiamo che io ho una sequenza
10001011 01010110 11010101

Voglio poter invertire un bit a caso, trovando la posizione con random().

E mi serve anche poter togliere un bit da una posizione qualsiasi, ed aggiungerne uno alla fine.

10001011 01X101101 10101011

Cosìcchè quando lo vado a leggere come char i valori sballano.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:11   #4
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Be', se ti serve di leggere il bit di indice 31 (il 32-simo), puoi usare (1 << 31), che ti darà:
Codice:
10000000000000000000000000000000
Con un semplice AND sul valore originario potrai filtrare il solo bit che ti interessa. Puoi anche farti delle macro:
Codice:
#define BIT(i) (1 << (i))
#define BIT_TEST(n, i) (((n) & BIT(i)) >> (i))
Una volta trovato il numero che attivi il singolo bit di indice i (con la macro BIT), è banale disattivare quel singolo bit:
Codice:
inline void clear_bit(int *n, int i)
{
  int mask = BIT(i);
  int result = (*n);

  result &= (~mask);
  (*n) = result;
}
Et cetera... con poco sforzo dovresti riuscire a fare tutto. Solo non mi è chiara una cosa: intendi anche fare uno scorrimento, dove isoli un singolo bit di indice n dal numero e lo "trasporti" in una nuova posizione m nel numero? Oppure intendevi solo disattivarne uno (clear_bit()) e impostarne un'altro?
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:19   #5
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Be', se ti serve di leggere il bit di indice 31 (il 32-simo), puoi usare (1 << 31), che ti darà:
Codice:
10000000000000000000000000000000
Con un semplice AND sul valore originario potrai filtrare il solo bit che ti interessa. Puoi anche farti delle macro:
Codice:
#define BIT(i) (1 << (i))
#define BIT_TEST(n, i) (((n) & BIT(i)) >> (i))
Una volta trovato il numero che attivi il singolo bit di indice i (con la macro BIT), è banale disattivare quel singolo bit:
Codice:
inline void clear_bit(int *n, int i)
{
  int mask = BIT(i);
  int result = (*n);

  result &= (~mask);
  (*n) = result;
}
Et cetera... con poco sforzo dovresti riuscire a fare tutto. Solo non mi è chiara una cosa: intendi anche fare uno scorrimento, dove isoli un singolo bit di indice n dal numero e lo "trasporti" in una nuova posizione m nel numero? Oppure intendevi solo disattivarne uno (clear_bit()) e impostarne un'altro?
Ottimo ora provo
Cmq per lo scorrimento mi basta rimuoverne (non disattivare) uno e inserirne uno casuale alla fine.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:22   #6
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Ok, ma i bit meno significativi di quello che stai "rimuovendo" andrano spostati a sinistra tutti quanti...
Non è difficile da fare nemmeno quello, se ti serve una mano, dimmi pure.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:25   #7
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Ok, ma i bit meno significativi di quello che stai "rimuovendo" andrano spostati a sinistra tutti quanti...
Non è difficile da fare nemmeno quello, se ti serve una mano, dimmi pure.
Esatto è questo che mi manca
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:29   #8
variabilepippo
Senior Member
 
L'Avatar di variabilepippo
 
Iscritto dal: Mar 2007
Messaggi: 1792
In che modo sono memorizzati i bit (int, array, altro)?
variabilepippo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:33   #9
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Esatto è questo che mi manca
Tu vuoi togliere, ad esempio, il decimo bit da un numero, e questo abbiamo già visto come si fa. Ora, come fai a prendere solo i bit da 0 a 8 (i 9 bit meno significativi del decimo)?
Codice:
int mask = BIT(9) - 1;

menosignificativi = (numero & mask);
numero &= (~mask); /* pulisci i bit meno significativi del decimo */

menosignificativi <<= 1; /* shift a sinistra di una posizione */
numero |= menosignificativi | bitcambiato; /* il bit che vuoi impostare */
Effettivamente, se usi delle array invece di numeri interi, il discorso è simile, ma non puoi applicare gli operatori bitwise...
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:36   #10
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Ah, comunque, la macro che avevo messo prima, BIT_TEST(), può anche essere scritta così:
Codice:
#define BIT_TEST(n, i) (((n) >> (i)) & 1)
che probabilmente è anche più efficiente.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:39   #11
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
io memorizzo la sequenza di bit come unsigned char*, ma se necessario lo posso benissimo cambiare.

Sinceramente non ci sto capendo molto
Mi "studio" per bene gli esempi...
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:49   #12
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Come unsigned char*? Quindi, un'array dinamica dove ogni cifra che usi è rappresentata da un byte? Allora i miei esempi non funzionano...

Gli esempi che io ti avevo fatto sfruttavano la rappresentazione dei numeri in binario naturale, quindi visti come un "numero"; se vuoi usare un'array come fai adesso, devi adattare un po' le cose che ti avevo scritto.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 15:55   #13
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Come unsigned char*? Quindi, un'array dinamica dove ogni cifra che usi è rappresentata da un byte? Allora i miei esempi non funzionano...

Gli esempi che io ti avevo fatto sfruttavano la rappresentazione dei numeri in binario naturale, quindi visti come un "numero"; se vuoi usare un'array come fai adesso, devi adattare un po' le cose che ti avevo scritto.
La mia idea era di usare proprio il binario naturale; solo che la sequenza è troppo lunga per stare in un solo numero; dovrebbero essere attorno ai 100 bits... ma dovrebbe comportarsi come un'unica sequenza, non come n chars.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 16:06   #14
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quindi, hai un certo numero di celle di memoria contigue che contengono il numero codificato in binario naturale, per superare il massimo di 32 bit? Puoi usare una serie di unsigned int, così avrai 32 bit per ogni numero:
Codice:
32 bit + 32 bit + 32 bit + 32 bit > 100 bit
Te ne basterebbero 4 per definire un numero "grosso" (ovviamente la quantità dipende dalla grandezza del tipo che usi: puoi saltare direttamente su un long se è più conveniente).
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 16:58   #15
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Salve,
volevo accompagnare la tesina (si sono in ritardo bestia ) con una simpatica demo, dato che tutti portano powerpoint e io non mi sentivo da meno

Cmq apparte ciò, ho sviluppato un programmino bastanza semplice che simula l'evoluzione di "bestie", che vengono generate proceduralmente a partire da una stringa di bits, la quale viene modificata per delezione o modifica o crossover secondo lo standard degli algoritmi genetici.
Se le stringhe sono di dimensione variabile e devi poter togliere e aggiungere pezzi molto piu' semplice andare con un vector<bool>. A meno che la cosa non ti causi problemi di memoria probabilmente e' anche piu' veloce.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 16:59   #16
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Già... e in un array di quel tipo come potrei fare per invertire o rimuovere un bit arbitrario?
Ricapitolo gli esempi che non so se ci siamo intesi

-"mutazione"
01010101011011010101011001010010101001010100101010100101
|
v
01010101011011010101011011010010101001010100101010100101
bit evidenziato invertito

-"delezione"

010101010110110101010110X10100101010010101001010101001010
bit X rimosso, e aggiunto uno alla fine (0)

Cmq sperimentando ho notato che è meglio leggere a blocchi di float.
La sequenza sarebbe quindi un float[16], 512 bits.

Scusa l'accollo, ma mi potresti ricapitolare come fare le due operazioni? Mica ho capito
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 17:07   #17
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Tommo Guarda i messaggi
-"delezione"

010101010110110101010110X10100101010010101001010101001010
bit X rimosso, e aggiunto uno alla fine (0)
Ah, quindi la dimensione e' fissa ? In tal caso bitset<> e' tuo amico...
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 17:10   #18
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Già... e in un array di quel tipo come potrei fare per invertire o rimuovere un bit arbitrario?
Non e' molto difficile
Quote:
-"mutazione"
01010101011011010101011001010010101001010100101010100101
|
v
01010101011011010101011011010010101001010100101010100101
bit evidenziato invertito
Codice:
typedef vector<bool> Code;
void invert( Code& c, position p)
{
  c[p] = !c[p];
}

Quote:
-"delezione"

010101010110110101010110X10100101010010101001010101001010
bit X rimosso, e aggiunto uno alla fine (0)
Codice:
void remove( Code& c, position p)
{
  c.erase(p);
  c.push_back( 0 );
}
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 19:50   #19
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Ma un bool è grande un bit?
Credo di no, un vettore di bool non è equivalente ad un segmento di binario naturale... io avevo letto che un bool è cmq grande un byte.

Cmq si bitset è mio amico... pare faccia tutto quello che mi serve.
Ma da un bitset lungo 512, come faccio ad estrarre floats di 32 in 32?
Quello restituisce solo unsigned longs...

EDIT: Dunque, a quanto pare la cosa migliore è un array di bools, associati a 0 e 1. Mi rimane solo da capire come convertire questo binario "virtuale" in binario naturale, per estrarne dei floats...

Approccio che mi viene in mente: generare i floats in tempo reale, partendo da un float i cui bits sono tutti 0, e attivandoli uno ad uno con gli operatori bitwise, seguendo spezzoni del codice di bools.
Possibile?
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 27-06-2008 alle 20:01.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 20:35   #20
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
mi sfugge perche' tu voglia estrarre dei float
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
HP blocca anche le cartucce di inchiostr...
Acquisizione Apple: SigScalr chiude, gli...
Cooler Master HAF II 500 integra le vent...
I musulmani non dovrebbero usare le crip...
AMD Radeon 9000 pronte a sorpassare le N...
Soulframe, il nuovo gameplay chiarisce m...
La Commissione UE presenterà una ...
Niente più eliche: con due ali, i...
Waze si aggiorna con nuove funzioni IA: ...
Oltre 200 economisti ed esperti di IA la...
I migliori produttori del 2026? Facci sa...
Claude Code consuma fino a 33 mila token...
Si chiama Starfire il chip con cui Intel...
Chrome espone l'OS reale dietro ogni ric...
Intel investe altri 5 miliardi di euro p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v