按位操作帮助/建议

时间:2014-10-29 18:30:04

标签: c bit-manipulation bitwise-operators computer-architecture

好吧,我不是在寻找答案或类似的东西。因此,在最近的考试中,当我被要求执行一些相对简单的按位操作时,我似乎无法完成工作。给了30分钟到一个小时,我可以冲洗它,但是在10分钟或更短的时间内,我就会卡住。

例如,我最近被要求编写一个小函数,如果x> y,返回1,否则为0。  我无法为我的生活提供答案。考试结束后,我回家写了答案,但我花了半个小时。

我尽力加快速度,因为我知道我会在决赛中再次得到这些问题。

我可以用什么规则,公理或任何东西来帮助我解决这些问题。当你看到这样的问题时,有什么推理可以帮助你形成答案。

1 个答案:

答案 0 :(得分:0)

您需要以下一般知识

  • 了解C运营商
  • 2&2的补码算法
  • 布尔代数

可能派上用场的技巧是 n位折叠。例如,让我们说我给了一个32位的值作为我的函数的参数,如果任何位是1,我需要返回1,否则返回0。 (进一步假设问题的规则不允许我以任何合理的方式做到这一点。)然后我的功能看起来像这样

int hasBitsSet(uint32_t value)
{
    value |= value >> 16;
    value |= value >>  8;
    value |= value >>  4;
    value |= value >>  2;
    value |= value >>  1;

    return value & 1;
}

该功能的前五行" fold" 32位值,如果任何位为1,则结果的LSB为1.函数的最后一行返回LSB。使用强力布尔代数,等效函数是

int hasBitsSet(uint32_t value)
{
    uint32_t bit31 = (value >> 31) & 1;
    uint32_t bit30 = (value >> 30) & 1;
    ...
    uint32_t bit0  = value & 1;

    return bit31 | bit30 | ... | bit0;
}

关键是 folding 有时可以减少你必须编写的代码量,但是你可以用折叠完成任何事情。蛮力布尔代数。因此,如果您不确定折叠是否有效,那么就去做代数。


我最后要提到的是,比较通常是通过减法来实现的。换句话说,要确定是否x > y,先计算x - y,然后检查结果是否为正数。在2的补码算法中,如果MSB为0并且至少其中一个位为1,则数字为正。因此,您可以提取MSB,折叠其他31位,然后使用布尔代数生成最后的结果。

最后一点知识(比较等同于减法)是特定于问题的,并且特别麻烦,因为每个问题都会有一些神秘的知识,使问题更容易。所有你能做的就是在课堂上注意,并希望当他们被提及时,那些小宝石会留在你的脑海里。