13

ゲイル・ラークマン・マクダウェルによるテキスト「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 ページにあります。

4

4 に答える 4

28

仮定しましょうi= 5

(1 << i)01000001が6番目のビット位置に配置されていることを確認してください

したがって1、それから減算すると、0011111==>最初の5ビットのみが設定され1、他のビットは設定され0、それがマスクを取得する方法です

結論: を指定するi と、最初のビットが に設定され、他のビットが に設定され(1 << i) -1たマスクが提供されます。i10

于 2013-04-04T16:44:53.523 に答える
3

// 最上位ビットから i まで (包括的) のすべてのビットをクリアするには、次のようにします。

int clearMSBthroughI(int num, int i) {
    int mask = (1 << i) - 1;
    return num & mask;
}

Take the example of i = 3
1<<3 gives you 0x00001000 
(1<<3)-1 gives you 0x00000111
num & (1<<i)-1 will clear the bits from msb to i

// i から 0 (0 を含む) までのすべてのビットをクリアするには、次のようにします。

int clearBitsIthrough0(int num, int i) {
    int mask = ~(((1 << (i+1)) - 1);
    return num & mask;
}

i = 3 の同じ例があなたに与えます

1 <<(3+1) =0x00010000
1 <<(3+1)-1 = 0x00001111
mask =~(1<<(3+1)-1) = 0x11110000
num & mask will cleaR the bits from 0 throuh i
于 2013-04-04T16:58:57.350 に答える