我最近在一次采访中被问过,只使用位移操作符,编写一些代码,告诉你一个数字是否可以被8整除,显然代码很短 - 有没有人知道?
答案 0 :(得分:23)
对于以二进制表示的任何整数,除以2的任何幂的余数仅仅是较低位的位的值,因此0b11001110
除以0b1000
具有余数0b110
。因此,为了检查8的可分性,您需要检查三个低位是否都为零:
if (((x >> 3) << 3) == x)
divisibleBy8 = true;
右移在左移之前清除底部三位,然后恢复幅度,然后与原始数字进行比较。
正如其他人所指出的,如果你知道整数的位宽,你可以这样做
if (!(x<<29))
divisibleby8 = true;
对于64位整数等替换29乘以61.显然在Java中你可以这样做:
if ((x << -3) != 0)
divisibleby8 = true;
因为-3
等负向移位被解释为bit_width - 3
,它将同时适用于32位和64位整数。
(你不需要所有的括号,为了清楚起见,我已经包括在内)
仅为完整性
这些都是通过8测试可分性的非常糟糕的方法。if !(x & 7)
更清晰,几乎可以肯定是快速或更快。
答案 1 :(得分:8)
int num;
if(!(num & 7)) {
// num divisible by 8
}
或
if(! (num << 29) ) { // assuming num is 32 bits
// num divisible by 8
}
答案 2 :(得分:4)
在Java中,不知道类型是long
还是int
你可以做到这一点
if((x << -3) != 0)
对于该类型,这将移位29或61位。只有低3位为0才会出现这种情况。
答案 3 :(得分:2)
if (x & ((1 << 3)-1) == 0)
或者,如果你真的想使用shifs:
if (x == ((x >> 3) << 3))
答案 4 :(得分:1)
检查n的可分性为9的最简单方法是执行n%9。 另一种方法是对n的数字求和。如果数字的总和是9的倍数,那么n是9的倍数。 上述方法不是基于位运算符的方法,需要使用'%'和'/'。按位运算符通常比模运算符和除运算符更快。以下是基于位运算符的方法,用于检查可分性9。
你应该检查这个链接 http://www.firmcodes.com/check-number-multiple-9-using-bitwise-operators/
答案 5 :(得分:0)
x << (32-3) == 0
int
; x << (64-3) == 0L
的{{1}}。
答案 6 :(得分:0)
为了简单起见
如果你想知道任何给定的整数N是否是X的倍数,X是2的幂,那么就这样做:
public static boolean isMultipleOfpowerOf2(int n, int x) {
if((n&(x-1))==0){
return true;
}else {
return false;
}
}
为什么这样做?
考虑X = 8;
8: 1000*
9: 1001
10: 1010
11: 1011
12: 1100
13: 1101
14: 1110
15: 1111***
16: 10000*
17: 10001
18: 10010
19: 10011
20: 10100
21: 10101
22: 10110
23: 10111***
24: 11000*
现在你可以清楚地看到,8的任何倍数都没有使用3 *右位,这对于2的所有幂都是如此。 你可以看到X-1,7使用了所有这些位***。
现在剩下的很简单,您可以使用&amp;(X-1)屏蔽所有其他位,如果答案为零,那么您有一个倍数。
N & (X-1) with N = 9, X=8
N(9) = 1001
X(8-1) = 0111
N&(X-1) = 0001 this case is != 0
N(16) = 10000
X(8-1) = 00111
N&(X-1) = 00000 this time is == 0, it is a multiple.
更多相关信息可以在这篇非常好的文章中找到: GetPrivateProfileInt
答案 7 :(得分:0)
if (((x >> 3) << 3) == x)
divisibleBy8 = true;
输入0(零)
会失败答案 8 :(得分:-4)
static boolean divisibleBy8(int num) {
return (number & 7) == 0;
}