c - 如何使用按位运算符、掩码来查找一个数字是否是另一个数字的倍数?

标签 c bit-manipulation bitmask tilde

所以有人告诉我这是可以做到的,而且按位运算和掩码可能非常有用,但我一定遗漏了它们的工作原理。

我正在尝试计算一个数字(例如 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/

相关文章:

c++ - 你能直接从C++中的位域中提取位掩码吗?

c++ - 在 C++ 中使用由 iOS native 库公开的 C 位掩码(匿名枚举)

c - 分配内存时出错

c - 为什么我在 "for"循环中收到错误,提示 'break' 语句不在循环或 switch 中?

将 14 位转换为 8 位并返回

c - 为 32 位微 Controller 编写掩码的替代方法

algorithm - 使用 base-2 数字对唯一选项列表进行编码的技术是否有名称?

c - 如何在单线程服务器上处理多个客户端(使用套接字)

c++ - scanf 没有按预期工作

c - 解释这个功能