Я готовлюсь к интервью, используя текст "Cracking the Coding Interview" от Gayle Laakman McDowell. В разделе, посвященном обработке бит, есть две функции, которые предоставляются, но я не совсем понимаю, как это работает.
// 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;
}
В первой функции я понимаю, что делает (1 << i)
, конечно, но я не уверен, что вычитание 1 из этого значения влияет на биты (т.е. (1 << i) - 1)
).
В основном я имею ту же путаницу со второй функцией. Для каких эффектов, в частности, на битах, есть ли вычитание 1 из ((1 << (i+1))
? По моему мнению, ((1 << (i+1))
приводит к одному биту "on", сдвинутому влево я + 1 раз - что вычитает это на 1?
Спасибо, и я надеюсь, что это было ясно! Пожалуйста, дайте мне знать, если есть другие вопросы.
Для тех, кто случайно имеет текст, на который я ссылаюсь, он на стр. 91 в 5-м выпуске.