所以有人告诉我这是可以做到的,而且按位运算和掩码可能非常有用,但我一定遗漏了它们的工作原理。
我正在尝试计算一个数字(例如 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 的倍数?另外有人可以对上面给出的代码给出数字解释吗?展示这一点可以帮助我理解为什么它不起作用。我相信,一旦我明白为什么它不起作用,我将能够自己解决问题。
最佳答案
我不确定您为什么会考虑为此使用按位运算?他们当然有自己的位置,但这不是。
更好的方法是简单地使用如下内容:
unsigned multGreaterOrEqual(unsigned x, unsigned y) {
if ((x % y) == 0)
return x;
return (x / y + 1) * y;
}
<小时/>
但是要回答您添加的关于如何计算出一个数字是十六的倍数的问题,这可以相对容易地完成。您会注意到以下所有倍数中的一个模式:
0 == 0000 0000 0000 0000
16 == 0000 0000 0001 0000
32 == 0000 0000 0010 0000
48 == 0000 0000 0011 0000
64 == 0000 0000 0100 0000
:
512 == 0000 0010 0000 0000
\__/
\
These bits are always zero.
因此可以使用以下表达式检测十六的倍数:
(value & 0x0f) == 0
但是,这仅适用于 2 的幂,不适用于任意除数。
关于c - 如何使用按位运算符、掩码来查找一个数字是否是另一个数字的倍数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29224648/