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

god*_*lla 9 bit-shift bitwise-operators

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

Jac*_*ley 23

对于以二进制表示的任何整数,除以2的任何幂的余数仅仅是较低阶的位的值,因此0b11001110除以0b1000余数0b110.因此,为了检查8的可分性,您需要检查三个低位是否全为零:

if (((x >> 3) << 3) == x)
  divisibleBy8 = true;
Run Code Online (Sandbox Code Playgroud)

右移在左移位之前清除底部的三位,然后恢复幅度,然后与原始数字进行比较.

正如其他人所指出的,如果你知道整数的位宽,你可以这样做

if (!(x<<29))
  divisibleby8 = true;
Run Code Online (Sandbox Code Playgroud)

对于64位整数等替换29乘以61.显然在Java中你可以这样做:

if ((x << -3) != 0)
  divisibleby8 = true;
Run Code Online (Sandbox Code Playgroud)

因为负向移位如-3被解释为bit_width - 3并且它将适用于32位和64位整数.

(你不需要所有的括号,为了清楚起见,我已经包括了)

只是为了完整

这些都是通过8测试可分性的非常糟糕的方法.做得if !(x & 7)更清楚,几乎肯定是快速或更快.

  • 这不是"可以被4整除"吗? (3认同)

Ser*_* L. 8

int num;

if(!(num & 7)) {
     // num divisible by 8
}
Run Code Online (Sandbox Code Playgroud)

要么

if(! (num << 29) ) { // assuming num is 32 bits
    // num divisible by 8
}
Run Code Online (Sandbox Code Playgroud)

  • @PeterLawrey问题带有C标签,它是有效的C.你适合java. (2认同)