找到一个数字是否可被8整除 - 使用位移算子

时间:2013-06-24 18:13:11

标签: bitwise-operators bit-shift

我最近在一次采访中被问过,只使用位移操作符,编写一些代码,告诉你一个数字是否可以被8整除,显然代码很短 - 有没有人知道?

9 个答案:

答案 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)

{p> 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;
}