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.