Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-08-2007, 10: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, 10: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, 17: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, 08: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, 08: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, 09: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 13:25.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-08-2007, 12: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 12:33.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 10-08-2007, 13: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, 15: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, 15: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 17:47.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 17: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


Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
Spento lo strumento LECP della sonda spa...
Voyager Technologies ha siglato un accor...
GoPro annuncia la linea MISSION 1 con tr...
Alcune varianti dei futuri Samsung Galax...
Il ridimensionamento di OnePlus in Europ...
Il cofondatore di Netflix ha lasciato l'...
ASUS porta in Italia il nuovo Zenbook Du...
Assassin's Creed: Black Flag Resynced, s...
Xbox Game Pass cambierà: tra le n...
I nuovi Surface Pro e Laptop sono vicini...
OnePlus ci riprova con la fascia bassa: ...
La Top 10 delle offerte Amazon del weeke...
XGIMI MoGo 2 Pro a 339€: Google TV con N...
Forum IT & Intelligence 2026: dall'A...
iPhone 16e per la prima volta a meno di ...
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: 05:46.


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