相关疑难解决方法(0)

使用单个乘法提取位

我看到在使用了一个有趣的技术,答案另一个问题,并想好一点理解.

我们给出了一个无符号的64位整数,我们对以下几位感兴趣:

1.......2.......3.......4.......5.......6.......7.......8.......
Run Code Online (Sandbox Code Playgroud)

具体来说,我们希望将它们移到前八位,如下所示:

12345678........................................................
Run Code Online (Sandbox Code Playgroud)

我们不关心指示的位的值.,并且不必保留它们.

溶液是屏蔽掉不需要的位,并且乘以结果0x2040810204081.事实证明,这就是诀窍.

这种方法有多普遍?这种技术可以用来提取任何比特子集吗?如果不是,如何判断该方法是否适用于特定的位组?

最后,如何找到(a?)正确的乘数来提取给定的位?

c bit-manipulation multiplication

298
推荐指数
5
解决办法
2万
查看次数

位操作:清除位范围

我准备采访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) - …

c bit-manipulation

11
推荐指数
2
解决办法
6849
查看次数

标签 统计

bit-manipulation ×2

c ×2

multiplication ×1