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?
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'? –
@DanielFischer w moim problemie '(n + p)' nie wykracza poza 31. i jest łatwy do zidentyfikowania ... – noufal
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. –