2013-06-01 12 views
5

Qui voglio generare un modello di bit per impostare n cifre pari a 1 a partire dalla posizione p. Le cifre sono numerate da 0 to 31. Il seguito è quello che ho fatto.Generazione di un particolare schema di bit utilizzando operatori bit a bit

int bitPattern(int n, int p) { 
    int hex, num1, num2; 
    hex = 0x80000000; 
    num1 = (hex >> (31 - p)); 
    num2 = (hex >> (31 - (n+p))); 
    return num1^num2; 
} 

Esempio:

bitPattern(6, 2) should return 
..000011111100 

eventuali soluzioni alternative con meno operatori?

+2

Si sta invocando un comportamento non definito quando 'n + p> 31'. Se è garantito che non si verifichi mai, hai ancora un comportamento definito dall'implementazione che sposta a destra un numero negativo. Ma se non hai paura di UB, che dire '((1 << n) - 1) << p'? –

+0

@DanielFischer nel mio problema '(n + p)' non andrà oltre 31. ed è facile identificare anche ... – noufal

+1

Ad ogni modo, se ti interessano solo i bit, ti consiglio di usare un tipo senza segno, e quindi '((1 << n) - 1) << p' è sicuro a meno che' n' o 'p' siano negativi o maggiori o uguali alla larghezza del tipo. –

risposta

5

Si può fare in questo modo:

return ((1<<n)-1)<<p; 

Per rendere n quelli in posizione zero, calcolare (2^n)-1; ricorda che 2^n è 1<<n, quindi l'espressione diventa ((1<<n)-1). Ora è necessario aggiungere p zeri sul retro, quindi spostare il risultato a sinistra di p.

+0

@danielFischer ha dato la stessa risposta ... Grazie per la spiegazione ... – noufal