ゲイル・ラークマン・マクダウェルによるテキスト「Cracking the Coding Interview」を使用したインタビューの準備をしています。ビット操作のセクションで、2 つの関数が提供されていますが、そのしくみがよくわかりません。
// 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)
。
私は基本的に2番目の機能と同じ混乱を抱えています。から 1 を引くと、具体的にはビットにどのような影響((1 << (i+1))
がありますか? 私の理解で((1 << (i+1))
は、単一の「オン」ビットになり、左に i+1 回シフトされます。これを 1 減算するとどうなりますか?
ありがとうございます。他にご不明な点がございましたら、お気軽にお問い合わせください。
たまたま私が参照しているテキストをお持ちの方のために説明すると、第 5 版の 91 ページにあります。