2016-04-13 13 views
7

Vedere la cronologia delle modifiche di "Making a basic algorithm". C'è stato un palpabile senso di delusione tra gli intervistati quando OP ha cambiato la domanda, invalidando alcune risposte interessanti. Quindi, immagino, perché non chiedo nuovamente la domanda originale, per consentire a quelle risposte di alzarsi in piedi.Creazione di un algoritmo di base: la versione più interessante

Quindi, fondamentalmente voglio trovare un modo più semplice per fare questo:

if(size == 2) unit /= 2; 
if(size == 2 || size == 6) unit /= 2; 
if(size == 2 || size == 6 || size == 10) unit /= 2; 

Quindi, in pratica si verifica se la dimensione è pari a 2 e poi ogni nuova linea si aggiunge 4 per l'ultimo controllo dimensioni .

ho bisogno di andare fino a 256.

Voglio sapere se c'è un modo semplice di fare questo.

+1

Mi congratulo per questo. –

+0

Puoi fornire un titolo descrittivo o una descrizione in modo che possa essere utile a qualcuno in futuro? Nessuno che sta cercando "algoritmo di base" si imbatterà mai in questo. –

+0

@ Qualche suggerimento? –

risposta

9

Il criterio fondamentale sui numeri controllati per uguaglianza ecco che la rimasero di size/4 è 2. Questo può essere rilevato utilizzando l'operatore modulo, %:

size % 4 == 2 

V'è poi il problema di come molte volte per dividere unit per 2. per gli esempi precedenti:

  • per size == 2, unit /= 8 (corrisponde a tutti 3 condizioni);
  • per size == 6, unit /= 4 (corrisponde alle seconde 2 condizioni);
  • per size == 10, unit /= 2 (corrisponde all'ultima condizione).

Quindi minore è il numero, più volte è diviso 8. Se il massimo size controllato è 10, unit è diviso per 2^(1 + (10 - size)/4). Questo può essere espresso in modo conciso utilizzando l'operatore di spostamento a destra:

unit >>= 1 + (10 - size)/4 

o, più in generale:

unit >>= 1 + (max_number - size)/4 

dove max_number % 4 == 2.

impostazione max_number = 254 (256 è specificato nella questione, ma non caratterizzerebbe nell'espressione, l'ultimo numero controllato sarebbe 254), e rilevando che applichiamo solo questo se 2 <= size <= 254, siamo in grado di esprimere la risposta finale come:

if (size % 4 == 2 && size >= 2 && size <= 254) { 
    unit >>= 1 + (254 - size)/4; 
} 

In realtà, la condizione può essere espressa in modo più conciso (ma certamente meno essere letti) come:

if ((size & 0xffffff03) == 2) 

come notato di @PaulBoddington, è necessario prestare attenzione con le dimensioni del turno di destra: se l'unità è un int e il numero di bit spostati è maggiore di 31, allora unit dovrebbe essere semplicemente impostato su zero.

+1

Dipende dal tipo di 'unità'. Se 'unit' è un' int', gli importi shift vengono letti in modulo 32, quindi dovresti fare 'int p = 1 + (254 - size)/4; unità = p> 31? 0: unità >> p; '. –

+0

@PaulBoddington molto vero. –