所以我被告知可以这样做,按位操作和掩码可能非常有用,但我必须忽略它们的工作原理。
我试图计算一个数字,比如x,是否是y的倍数。如果x是故事的重要部分的倍数,否则我想增加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的倍数?还有人可以给出上面给出的代码的数字解释吗?显示这可能有助于我理解为什么它不起作用。一旦我明白为什么它不起作用,我就能自己解决问题。我相信。
答案 0 :(得分:1)
为什么你甚至想为此使用逐位操作?他们当然有自己的位置,但事实并非如此。
更好的方法是简单地使用以下内容:
unsigned multGreaterOrEqual(unsigned x, unsigned y) {
if ((x % y) == 0)
return x;
return (x / y + 1) * y;
}
答案 1 :(得分:0)
在平凡的情况下,每个2的幂的偶数倍的数字只是向左移动(这可能在改变符号位时不适用)
例如
10100
是4次
101
和 10100
是2次
1010
对于其他倍数,必须通过组合两个班次的输出来找到它们。你可能想要查找一些原始的计算机划分方法,其中除法看起来大致像
x = a / b
实施类似
buffer = a
while a is bigger than b; do
yes: subtract a from b
add 1 to x
done
更快的例程尝试首先找出更高级别的位置值,跳过大量的减法。所有这些例程都可以按位完成;但这是一个很大的痛苦。在ALU中,这些例程按位完成。可能想要查找数字逻辑设计书以获得更多想法。
答案 2 :(得分:0)
好的,所以我发现了我的代码中的错误,因为大多数人说不可能使用掩码来计算一个数字是否是另一个数字的倍数,我想我会分享我学到的东西。 有可能的! - 如果您使用的是正确的数据类型。
如果y被声明为常量unsigned long,则上面给出的代码有效,因为传入的x也是unsigned long。关键点不是长的或恒定的部分,而是数字是无符号的。此符号位导致计算错误,因为数字中的第一个位置表示符号,执行按位操作时,符号可能会混乱。
所以这是我的代码,如果我们正在寻找16的倍数: const unsigned long y = 16; //在我的案例中全局声明
然后将unsigned long传递给运行以下代码的函数: if(x&(y-1)){//如果不是0则为y的倍数 x = x&〜(y-1)+ y; } x现在将是最接近的16的倍数。