位运算帮助/建议

问题描述 投票:1回答:1

好吧,我不是在寻找答案之类的东西。所以最近的考试,当我被要求执行一些相对简单的位操作,我只是似乎无法把工作做好。给予30分钟到一个小时,我就冲出来,但10分钟或更少,我只是会被卡住。

例如,最近我要求写一个小功能,如果X> Y,返回1,否则为0。我不能为我的生活提供了一个答案。考试结束后,我就回家了,写出来的答案,但我花了一个半小时。

林尽我所能,让这个速度更快,因为我知道我将最终再次得到这些类型的问题。

什么是一些规则,公理,或任何东西,我可以利用来帮助我得走了这些类型的问题。当你看到这样的问题,有什么理由可以帮助你形成一个答案。

c bit-manipulation bitwise-operators computer-architecture
1个回答
0
投票

你会需要以下的一般知识

  • C运算符的理解
  • 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;
}

的函数的第五行“折叠”的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;
}

问题的关键是,折叠是在减少的,你必须编写的代码量有时是有用的,但任何事情,你可以用折叠做也可以用蛮力布尔代数来完成。所以,如果你不知道折叠是否会正常工作,那么就做代数。


我会提到的最后一件事是比较经常通过减法来实现。换句话说,确定是否x > y,第一计算x - y,然后检查结果是否是肯定的。在2码算术运算,一些是正面的,如果最高位为0,其他位中至少一个是1,所以,你可以提取MSB,褶皱的其它31位,然后用布尔代数来产生最终结果。

知识(比较等效于减法)的最后一点是针对特定问题的,是特别麻烦的,因为每一个问题都会有知识的一些神秘的珍闻,使问题更容易。所有你可以做的就是专心听讲,并希望这些小宝石粘在你的心中会提到的,当他们。

© www.soinside.com 2019 - 2024. All rights reserved.