Ottenere un indice di array (0,1,2, .. 8) dal valore di mascheramento dei bit (1,2,4,8.,256) senza utilizzare log2 (n). Forse un problema di design

0

Sto lavorando su un componente in cui inserisco dati e ottengo dati diversi come risultato. L'input è sempre lo stesso (3 oggetti). Da questi 3 oggetti è possibile calcolare fino a 9 altri oggetti. Viene eseguito un calcolo per ciascun oggetto di output. Prima di calcolare i dati di uscita, voglio impostare quale dei 9 oggetti deve essere calcolato.

  1. Imposta i dati di input
  2. Imposta quali dati di output devono essere calcolati
  3. Ottieni dati di output

Sto lavorando in Visual C ++ (C99). Al momento sto affrontando un po 'un problema di progettazione qui. Dopo aver impostato i dati di input, sto usando una maschera di bit per configurare quali dati di output dovrebbero essere calcolati.

const int  foo1 = 1;   //000000001
const int  foo2 = 2;   //000000010
const int  foo3 = 4;   //000000100
const int  foo4 = 8;   //000001000
const int  foo5 = 16;  //000010000
const int  foo6 = 32;  //000100000
const int  foo7 = 64;  //001000000
const int  foo8 = 128; //010000000
const int  foo9 = 256; //100000000

SetOutput(foo2 | foo4 | foo5 );

I dati sono contenuti in un array ARRAY[9] . Per quelli che sono stati impostati (foo2, foo4 e foo5) gli elementi contengono dati validi dopo il calcolo ( ARRAY[2] , ARRAY[4] , ARRAY[5] )

Quindi voglio ottenere i dati risultanti.

GetData(foo2);
GetData(foo4);
GetData(foo5);

Il mio problema è come ottengo l'indice dell'elemento dai valori della maschera foo2 = 2 , foo4 = 8 o per esempio foo5 = 16 ?
L'unica possibilità sarebbe prendere log2(n) e ottenere 2 , 3 e 4 , che sarebbero gli indici degli elementi corretti di ARRAY .

C'è un modo più semplice di questo? Ho pensato invece di usare una mappa, con il valore della maschera (1,2,4,8 ... 256) come campo chiave e i dati calcolati nel campo del valore. Ma preferirei mantenere la matrice statica. Grazie in anticipo!

    
posta tzippy 11.07.2016 - 21:39
fonte

1 risposta

1

Un array con 257 voci sarà veloce, portatile e di nuovo veloce. Molti compilatori forniscono una funzione incorporata molto veloce per contare i bit zero iniziali o finali in un numero, ad esempio __builtin_clz in gcc e Clang, che è probabilmente circa cento volte più veloce di una chiamata alla funzione log2.

    
risposta data 12.07.2016 - 00:05
fonte

Leggi altre domande sui tag