manipulacja bitami: czyszczenie zakresu bitów

Przygotowuję się do rozmowy kwalifikacyjnej za pomocą tekstu „Cracking the Coding Interview” autorstwa Gayle Laakman McDowell. W sekcji opisującej manipulację bitami dostępne są dwie funkcje, ale nie do końca rozumiem, jak to działa.

// To clear all bits from the most significant bit through i (inclusive), we do:
int clearMSBthroughI(int num, int i) {
    int mask = (1 << i) - 1;
    return num & mask;
}

// To clear all bits from i through 0 (inclusive), we do:
int clearBitsIthrough0(int num, int i) {
    int mask = ~(((1 << (i+1)) - 1);
    return num & mask;
}

W pierwszej funkcji rozumiem co(1 << i) oczywiście, ale nie jestem pewien, w jaki sposób odjęcie 1 od tej wartości wpływa na bity (tj.(1 << i) - 1)).

Zasadniczo mam to samo zamieszanie z drugą funkcją. Do jakich efektów, szczególnie na bitach, ma odejmowanie 1 od((1 << (i+1)) mieć? Z mojego zrozumienia((1 << (i+1)) daje pojedynczy bit „on”, przesunięty w lewo i + 1 razy - co robi odejmowanie tego przez 1?

Dzięki i mam nadzieję, że to było jasne! Daj mi znać, jeśli są jakieś inne pytania.

Dla tych, którzy z jakiegoś powodu mają tekst, do którego się odwołuję, jest na stronie 91 w 5. edycji.

questionAnswers(4)

yourAnswerToTheQuestion