我看到在使用了一个有趣的技术,答案到另一个问题,并想好一点理解.
我们给出了一个无符号的64位整数,我们对以下几位感兴趣:
1.......2.......3.......4.......5.......6.......7.......8.......
Run Code Online (Sandbox Code Playgroud)
具体来说,我们希望将它们移到前八位,如下所示:
12345678........................................................
Run Code Online (Sandbox Code Playgroud)
我们不关心指示的位的值.,并且不必保留它们.
该溶液是屏蔽掉不需要的位,并且乘以结果0x2040810204081.事实证明,这就是诀窍.
这种方法有多普遍?这种技术可以用来提取任何比特子集吗?如果不是,如何判断该方法是否适用于特定的位组?
最后,如何找到(a?)正确的乘数来提取给定的位?
我准备采访Gayle Laakman McDowell撰写的文章"Cracking the Coding Interview".在涉及位操作的部分,提供了两个函数,但我不太明白它是如何工作的.
// 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;
}
Run Code Online (Sandbox Code Playgroud)
在第一个函数中,我理解(1 << i)当然是什么,但我不确定的是从这个值中减去1如何影响位(即(1 << i) - …