我目前正在学习Intro编程课程。我们正在学习Java SE(最终升级为Java EE)。我对大多数事情都有把握,但是我通过按位操作和遮罩碰壁。例如:
在这里编辑: 我想弄清楚一个数字是否可以被3和5整除,但不能被2整除。唯一的要求是我不能使用%来找到答案,它必须在方法调用中,并且必须使用掩码和按位操作数。
我已经学会了如何确定数字是奇数还是偶数:
public static boolean isEven(int num) {
return ((num & 1) == 0);
}
我了解按位操作数(&,|,^,>>,<<)的作用,但实际上无法正确实现它们。我们的书也没有信息,这是从我们的老师的笔记中得出的。 我不仅在寻求答案,还需要了解它的实际工作原理。
答案 0 :(得分:0)
除非您的教授确实向您展示了如何进行此类操作,否则这些操作非常棘手。我将做3,然后您便知道该怎么做5。
之所以可行,是因为 4 == 1 mod 3 :
static boolean isDivisibleBy3(int n)
{
while(n<0 || n>3) {
n = (n&3) + (n>>2);
}
return (n==3 || n==0)
}
n&3
获取低两位。 (n>>2)
得到其余的位并除以4。因为 4 == 1 mod 3 ,除以4不会改变其余的mod3。然后将它们加在一起,并得到一个较小的数字,余数与我们开始时相同。
重复直到我们得到小于4的数字为止。届时,数字将不会变小。
有更快的方法可以做到这一点,但是这种方法最容易理解。