|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
[C/C++] Operazioni su una stringa di bits...
Salve,
volevo accompagnare la tesina (si sono in ritardo bestia 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... Ultima modifica di Tommo : 27-06-2008 alle 14:50. |
|
|
|
|
|
#2 |
|
Senior Member
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! |
|
|
|
|
|
#3 |
|
Senior Member
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. |
|
|
|
|
|
#4 |
|
Senior Member
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 Codice:
#define BIT(i) (1 << (i)) #define BIT_TEST(n, i) (((n) & BIT(i)) >> (i)) Codice:
inline void clear_bit(int *n, int i)
{
int mask = BIT(i);
int result = (*n);
result &= (~mask);
(*n) = result;
}
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
Cmq per lo scorrimento mi basta rimuoverne (non disattivare) uno e inserirne uno casuale alla fine. |
|
|
|
|
|
|
#6 |
|
Senior Member
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! |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
In che modo sono memorizzati i bit (int, array, altro)?
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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 */
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#10 |
|
Senior Member
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)
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#12 |
|
Senior Member
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! |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
|
|
|
|
|
|
|
#14 |
|
Senior Member
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
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
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 |
|
|
|
|
|
|
#16 |
|
Senior Member
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
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
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 |
|
|
|
|
|
#18 | |||
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Quote:
Codice:
typedef vector<bool> Code;
void invert( Code& c, position p)
{
c[p] = !c[p];
}
Quote:
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 |
|||
|
|
|
|
|
#19 |
|
Senior Member
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? Ultima modifica di Tommo : 27-06-2008 alle 21:01. |
|
|
|
|
|
#20 |
|
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 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:30.





















