2013-06-01 7 views
5

Tutaj chcę wygenerować wzór bitowy do ustawienia cyfr n cyfr równych 1 począwszy od pozycji p. Cyfry są ponumerowane od 0 to 31. Oto co zrobiłem.Generowanie określonego wzorca bitowego za pomocą operatorów bitowych

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

przykład:

bitPattern(6, 2) should return 
..000011111100 

wszystkich alternatywnych rozwiązań z mniej operatorów?

+2

Wywołujesz niezdefiniowane zachowanie, gdy 'n + p> 31'. Jeśli to zagwarantuje, że nigdy się tak nie stanie, nadal masz zachowanie zdefiniowane w ramach implementacji, przesuwając w prawo liczbę ujemną. Ale jeśli nie boisz się UB, co z '((1 << n) - 1) << p'? –

+0

@DanielFischer w moim problemie '(n + p)' nie wykracza poza 31. i jest łatwy do zidentyfikowania ... – noufal

+1

W każdym razie, jeśli zależy ci tylko na bitach, polecam używanie typu bez znaku, a następnie '((1 << n) - 1) << p' jest bezpieczne, chyba że' n' lub 'p' są ujemne lub większe lub równe szerokości typu. –

Odpowiedz

5

Można to zrobić tak:

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

Aby n te w pozycji zerowej, obliczyć (2^n)-1; przypominamy, że 2^n jest 1<<n, więc wyrażenie staje się ((1<<n)-1). Teraz z tyłu musisz dodać zera p, więc przesuń wynik pozostawiony przez p.

+0

@danielFischer dał tę samą odpowiedź ... Dziękuję za wyjaśnienie ... – noufal