【问题标题】:Bitwise Operations Help/Suggestions位运算帮助/建议
【发布时间】:2014-10-29 18:30:04
【问题描述】:

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

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

我正在尽我最大的努力在这方面做得更快,因为我知道我会在决赛中再次遇到这类问题。

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

【问题讨论】:

  • 不清楚问题是什么。
  • 嗯,了解一些布尔代数会有所帮助。
  • 后期编辑:你需要做更多的学习和编写一些软件。对于您似乎已经达到的水平,我们无能为力。
  • The Art of Assembly 是可以帮助您的最佳参考之一。您需要特别查看第 2、6 和 9 章,并注意 cmptestconditional jmp 指令说明。还有其他参考资料,但这是一个很好的普遍可用的参考资料。就像数学一样,重复(使用它足以让它沉入其中)是变得更快、更自信的关键。
  • @user3386109 您从问题中的哪些陈述中获得了特别的见解?我想也许我对此并不完全了解......也不确定装配建议来自哪里,因为问题被标记为 C......

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


【解决方案1】:

您将需要以下一般知识

  • 了解 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;
}

重点是 folding 有时有助于减少您必须编写的代码量,但是您可以用 folding 做的任何事情也可以用蛮力布尔代数。因此,如果您不确定 折叠 是否会起作用,那就做代数吧。


我要提到的最后一件事是,比较通常通过减法来实现。也就是说,判断是否x > y,首先计算x - y,然后判断结果是否为正。在 2 的补码算术中,如果 MSB 为 0 且其他位中至少有一个为 1,则该数为正数。因此您可以提取 MSB,折叠其他 31 位,然后使用布尔代数生成最终结果。

最后一点知识(比较等价于减法)是针对特定问题的,并且特别麻烦,因为每个问题都会包含一些使问题变得更容易的神秘知识。你所能做的就是在课堂上专心致志,并希望这些小宝石在被提及时能牢牢记住。

【讨论】:

  • 感谢您抽出宝贵时间回复。非常有帮助,超出了我的预期。
  • @i_know_nothing 如果这回答了您的问题,您可以点击赞成/反对箭头下方的复选标记以接受答案。
  • “如果任何位为 1,则返回 1,否则返回 0。”return (value != 0); 会这样做。
  • @Clifford 是的,但是对于限制可以使用哪些运算符的家庭作业问题或谜题,通常需要位折叠。并且比较运算符通常不在允许的运算符列表中。
  • @user3386109 :很公平。
猜你喜欢
  • 2011-06-06
  • 2011-02-10
  • 2020-05-20
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 2014-07-22
相关资源
最近更新 更多