【发布时间】:2015-03-24 03:40:44
【问题描述】:
所以有人告诉我,这是可以做到的,并且按位运算和掩码可能非常有用,但我肯定遗漏了它们的工作原理。
我试图计算一个数字,比如 x,是否是 y 的倍数。如果 x 是 y 的倍数,那么我想增加 x 以达到大于 x 的最接近的 y 倍数(以便所有 x 都适合结果)。我刚开始学习 C,但在理解其中一些任务时遇到了困难。
这是我尝试过的,但是当我输入 5、9 或 24 等数字时,我分别得到以下结果:0、4、4。
if(x&(y-1)){ //if not 0 then multiple of y
x = x&~(y-1) + y;
}
非常感谢任何解释,幕后发生的数学示例。
编辑:所以澄清一下,我有点理解位的移位来确定一个项目是否是一个倍数。 (正如在回复中解释的那样,10100 是 101 的倍数,因为它刚刚被转移)。如果我有数字 16,即 10000,它的补码是 01111。我将如何使用这个补码来查看一个项目是否是 16 的倍数?也有人可以对上面给出的代码进行数字解释吗?展示这一点可能有助于我理解为什么它不起作用。一旦我了解它为什么不起作用,我相信我将能够自己解决问题。
【问题讨论】:
-
要做到这一点,您别无选择,只能找到除法的其余部分。位运算符不能直接检查余数。但是,您可以仅使用按位运算符进行除法。但是你的问题应该是“如何只用按位运算符进行除法?”在这个网站上被问了很多次
-
我被要求在实验室中使用这种方法,当时我不明白,现在我正在寻找决赛,需要在那之前了解它。上面给出的代码类似于我的导师刚刚概括的代码。我之前已经找到了使用 mod (余数)的倍数,但这不是我要求的方法。我还被特别要求使用掩码设置为 y-1 的补码的掩码。
-
什么?!让我们尝试一个简单的,加法,首先:
0x1^0x1,哦等一下,没有进位,哦
标签: c bit-manipulation bitmask tilde