Esiste un modo per eseguire operazioni bit a bit con più di due stati

0

So come far funzionare il bit. Mi chiedo se hai bisogno di più di 2 stati c'è un modo per farlo usando bit invece di array e% operatori. Perché quelli sono veramente lenti.

Quindi nel caso in cui l'array salva lo stato per 4 semafori {0,1,2}

0000 + 0001 = 0001
0001 + 0001 = 0002
0002 + 0001 = 0000
0002 + 2002 = 2001

Ora posso fare

int[] a = new int[4]{0,0,0,2};
int[] b = new int[4]{0,0,0,2};

for (int i=0; i < a.length; i++) {
   a[i] = (a[i] + b[i]) % 3;
}

Qual è il modo migliore per farlo?

    
posta Juan Carlos Oropeza 13.06.2015 - 03:01
fonte

1 risposta

1

Puoi mettere insieme i bit per tenere traccia di qualsiasi numero di valori di stato di cui hai bisogno.

Se è necessario tenere traccia dei 4 valori di stato, utilizzare 2 bit.

Ogni bit ti dà 2 valori. 2 bit ti danno 2x2.

Non sono sicuro del motivo per cui sono stati raggruppati operatori di array e% come se fossero la stessa categoria di operazioni. % è un operatore di modulo. Non ritengo che l'operatore sia lento.

Ovviamente l'impilamento di bit può generare espressioni che possono sembrare complesse, ma qual è la priorità? È leggibilità o prestazioni? Vuoi essere efficiente nell'uso dello spazio per archiviare i tuoi dati?

Per utilizzare i dati organizzati come elementi a 2 bit, l'array 4-int che hai ottenuto sarà sostituito da un solo int.

Sulla maggior parte dei sistemi int saranno almeno 2 byte - quindi è più che sufficiente per contenere 4 valori a 2 bit (o "semafori" come dici tu.)

Faresti bene a confermare quale sia la dimensione di int sul tuo sistema.

E puoi provare questo codice:

int a = 0b10000000; // 4x2 bit value equivalent to: new int[4]{0,0,0,2};
int b = 0b00000011; // first item value is 3
size_data = 4;

for (int i=0; i < size_data; i++) {
   // expression: i*2 gives index for shr
   //             a >> i*2 & 0x03 gives the value of a
   //             b >> i*2 & 0x03 gives the value of b
   printf("i=%d   i*2=%d   a=%d b=%d\n", i*2, a >> i*2 & 0x03, b >> i*2 & 0x03);
}
    
risposta data 13.06.2015 - 05:47
fonte

Leggi altre domande sui tag