Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Il nuovo top di gamma vivo punta su un comparto fotografico particolarmente articolato, con un teleobiettivo da 200 megapixel e teleconvertitori esterni capaci di arrivare a 400 mm equivalenti. Lo abbiamo provato a Tenerife, mettendo alla prova fotocamere, prestazioni, autonomia e accessori. Ecco come si è comportato.
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
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


Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
RDNA 5 sulle APU AMD, ma non per tutti: ...
Marvell acquisisce Lumentum per 115 mili...
La febbre dei data center fa impennare i...
ECOVACS T90S OMNI crolla a 499€ su Amazo...
In Cina i camion elettrici hanno gi&agra...
Attacchi hacker ai supermercati in Europ...
I datacenter non piacciono? OpenAI prova...
Cupra Raval sfida BMW, Volvo e le altre:...
BYD supera per la prima volta le 300.000...
Crisi RAM, spunta un prezzo incredibile ...
Ginux, un nuovo kernel compatibile con L...
Gemini Notebook si aggiorna: arrivano i ...
Svolta per l'emulazione della prima Xbox...
Narwal celebra 10 anni: l'evoluzione tec...
TIM Enterprise acquisisce il 70% di VoiS...
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:35.


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