Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-06-2008, 12: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 14:50.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 14: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 16: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, 17: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, 17: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, 17: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, 18: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, 18: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, 20: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 21:01.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2008, 21: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


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
La missione con equipaggio Shenzhou-21 h...
Il Galaxy S26 Edge potrebbe essere ancor...
Google riaccenderà una centrale n...
Crollo per Pornhub nel Regno Unito:-77% ...
La Germania accende il suo cannone laser...
Il meglio di Amazon in 2 minuti: tira ar...
ECOVACS risponde a Eureka e dimezza il p...
Durissimo colpo per Nintendo: l'ufficio ...
Scope elettriche al minimo storico su Am...
Blue Jay e Project Eluna: robotica e AI ...
Scede a 949€ il Samsung Galaxy S25 Ultra...
Blue Yeti Nano in super offerta su Amazo...
Netflix sta preparando un'offerta per Wa...
Prezzo impossibile, è sceso ancor...
Torna il migliore dei mini PC economici:...
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: 19:30.


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