好吧,我不是在寻找答案或类似的东西。因此,在最近的考试中,当我被要求执行一些相对简单的按位操作时,我似乎无法完成工作。给了30分钟到一个小时,我可以冲洗它,但是在10分钟或更短的时间内,我就会卡住。
例如,我最近被要求编写一个小函数,如果x> y,返回1,否则为0。 我无法为我的生活提供答案。考试结束后,我回家写了答案,但我花了半个小时。
我尽力加快速度,因为我知道我会在决赛中再次得到这些问题。
我可以用什么规则,公理或任何东西来帮助我解决这些问题。当你看到这样的问题时,有什么推理可以帮助你形成答案。
答案 0 :(得分:0)
您需要以下一般知识
可能派上用场的技巧是 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位,然后使用布尔代数生成最后的结果。
最后一点知识(比较等同于减法)是特定于问题的,并且特别麻烦,因为每个问题都会有一些神秘的知识,使问题更容易。所有你能做的就是在课堂上注意,并希望当他们被提及时,那些小宝石会留在你的脑海里。