Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-08-2007, 11:47   #1
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
[c]giocando con i bit...

ho una serie imprecisata di numeri interi, devo sapere quante volte la sua versione binaria passa fa 0 a 1 e viceversa...
la coa più intelligente che ho al momento è un coso che tratta la sequenza come stringhe e le va a contare in modo stupidissimo...
esiste qualche modo intelligente per farlo?

ciao ciao!!! :-)
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 09-08-2007, 11:50   #2
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da NA01 Guarda i messaggi
ho una serie imprecisata di numeri interi, devo sapere quante volte la sua versione binaria passa fa 0 a 1 e viceversa...
la coa più intelligente che ho al momento è un coso che tratta la sequenza come stringhe e le va a contare in modo stupidissimo...
esiste qualche modo intelligente per farlo?

ciao ciao!!! :-)
cosa intendi per versione binaria ?
comunque esiste l´operatore << o >> che shifta i bit di n posizioni verso destra o sinistra. Se ti puo´ servire
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 09-08-2007, 18:39   #3
Furla
Senior Member
 
Iscritto dal: Feb 2004
Messaggi: 1454
shifta e maschera, evita di sprecare spazio trasformandoli in stringa o in altro tipo.
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 10-08-2007, 09:35   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Concordo: ti fai una copia dell'intero...poi testi il primo bit se è a zero o 1 con un & con 0x0001. A questo punto fai uno shift a destra e riparti da capo.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-08-2007, 09:41   #5
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
si, così mi evito la conversione, ma non ha molta importanza la velocità in questo caso (dato che comunque sarei costretto a farlo prima dell'esecuzione del programma).
quindi mi state confermando che non esistono modi intelligenti per capirlo al volo senza operazioni complesse (tenendo conto che deve giarere su un sistema che deve processare dati in tempo reale che già ora sta soffrendo un pò i troppi calcoli).
grazie, ciao!
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 10-08-2007, 10:16   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Mmmmhhh...non so sinceramente quale sia la versione più semplice fra il convertire in stringa e l'usare & e shift che sono comunque operazioni semplicissime per la CPU.

In alternativa ti propongo un metodo carino...e quasi immediato. Considera però che devi avere 512 byte di memoria disponbile.

Codice:
typedef struct XCHANGE 
{
  unsigned char x01;
  unsigned char x10;
} XCHANGE;

XCHANGE table[256];

table[0].x01 = 0;
table[0].x10 = 0;
table[1].x01 = 0;
table[1].x10 = 1;
table[2].x01 = 1;
table[2].x10 = 1;
table[3].x01 = 0;
table[3].x10 = 1;
table[4].x01 = 1;
table[4].x10 = 1;
table[5].x01 = 1;
table[5].x10 = 2;
table[6].x01 = 2;
table[6].x10 = 2;
e così via fino a 256. Nota che questa operazione ha costo zero al momento del controllo perché la andrai a farei solamente una volta durante tutta l'esecuzione del programma.

A questo punto la prima parte da controllare sarà questa:

Codice:
int data = XXXXXX;

unsigned char dataByte1 = (unsigned char)(data & 0xFF);
unsigned char dataByte2 = (unsigned char)((data & 0xFF00) >> 8);
unsigned char dataByte3 = (unsigned char)((data & 0xFF0000) >> 16);
unsigned char dataByte4 = (unsigned char)((data & 0xFF000000) >> 24);

int x01 = table[dataByte1].x01 + table[dataByte2].x01 + 
             table[dataByte3].x01 + table[dataByte4].x01;

int x10 = table[dataByte1].x10 + table[dataByte2].x10 + 
             table[dataByte3].x10 + table[dataByte4].x10;
Non è finita perché mancano ancora gli scambi fra 01 e 10 fra i vari byte, questa è ancora più semplice e immediata:

unsigned int sideBit1 = data & 0x01800000;
unsigned int sideBit2 = data & 0x00018000;
unsigned int sideBit3 = data & 0x00000180;

if(sideBit1 == 0x1000000) x01++;
if(sideBit1 == 0x0800000) x10++;
if(sideBit2 == 0x10000) x01++;
if(sideBit2 == 0x08000) x10++;
if(sideBit3 == 0x100) x01++;
if(sideBit3 == 0x080) x10++;

Ultima modifica di cionci : 10-08-2007 alle 14:25.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-08-2007, 13:29   #7
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
io propenderei per lo shift: è vantaggioso rispetto alla soluzione di cionci perché ti risparmi i 512 bytes di memoria, ed è vantaggioso rispetto alla conversione a stringa perché la conversione a stringa richiede sicuramente un numero maggiore di operazioni. ma ci vuole tanto a fare uno shift e controllare il bit meno significativo?

verrebbe così:
Codice:
int nTestValue;
.
.
.

unsigned int uBitCount = sizeof(nTestValue) * 8;  // notare le manie di portabilità estrema :asd:

for (int i = 0; i < uBitCount; i++) {
	if ((nTestValue >> (i + 1)) & 1) {
		// ho trovato un 1
	}
	else {
		// ho trovato uno zero
	}
}
edit - ho modificato leggermente il programma affinché il test non modifichi il valore della variabile nTestValue.

Ultima modifica di 71104 : 10-08-2007 alle 13:33.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 10-08-2007, 14:24   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da 71104 Guarda i messaggi
ma ci vuole tanto a fare uno shift e controllare il bit meno significativo?
E' quello che gli avevo proposto io all'inizio, ma se mi ha detto che è troppo costoso in termini di performance sicuramente la mia soluzione è meno costosa in termini di calcolo, ma più costosa dal punto di vista della memoria.

PS: avevo fatto qualche errorino sopra...corretto
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2007, 16:27   #9
W.S.
Senior Member
 
L'Avatar di W.S.
 
Iscritto dal: Nov 2005
Messaggi: 1868
più leggero e performante dello shift credo ci sia solo asm in-line...
Io voto per lo shift
__________________
[ W.S. ]
W.S. è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2007, 16:44   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Per farlo più leggero dell'algoritmo di 71104 c'è c'è la possibilità di giocare con i bit per il conteggio per evitare l'if.
Da notare che non vuole contare il numero di 1 e di 0, ma il numero di passaggi da 1 a 0 e da 0 a 1.

Ecco qui:
Codice:
/*in counter[0] ci sono i passaggi da 1 a 0, in counter[1] i passaggi da 0 a 1 */
int counter[2]: 

int data = xxxxx;
unsigned char previousLsb = data & 1;

data >>= 1;

for (int i = 1; i < uBitCount; i++) 
{
    unsigned char lsb = data & 1;
    data >>= 1;
    counter[lsb] += lsb ^ previousLsb;
    previousLsb = lsb;
}
Poi si potrebbe anche lavorare di loop unrolling....e sviluppare tutto il loop.

Ultima modifica di cionci : 12-08-2007 alle 18:47.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 18:46   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Correzioncina sopra
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
I 3 articoli low cost più venduti...
Nothing Phone (4a) e (4a) Pro: svelati i...
Già era regalato a 139€, oggi Lef...
Nuova rimodulaizone per i clienti TIM di...
Dyson PencilWash: il lavapavimenti ultra...
Oracle NetSuite si potenzia con nuove fu...
Musica generata con l'IA: Sony lavora a ...
Cyberpunk 2077 in versione PC su smartph...
BYD si gioca un grosso jolly: pronta Rac...
Samsung annuncia l'arrivo in Italia dei ...
Offerta lancio Pixel 10a: come ottenere ...
Google presenta Pixel 10a: poche le novi...
Caos F1 2026: 14 monoposto senza omologa...
Tesla festeggia il primo Cybercab prodot...
Desktop piccolo e potente? NZXT H2 Flow ...
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: 08:38.


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