检查数字是否为 2 的幂

如果整数 x 是 2 的幂,则只设置一个比特,而 x-1 之后设置所有比特。例如:41003011 作为二进制数,它满足上述条件。零不是 2 的幂,必须明确检查。

boolean isPowerOfTwo(int x)
{
    return (x != 0) && ((x & (x - 1)) == 0);
}

左右移位的用法

我们假设,我们有三种权限, READWRITEEXECUTE 。每个权限的范围从 0 到 7.(假设 4 位数系统)

RESOURCE = READ WRITE EXECUTE(12 位数)

RESOURCE = 0100 0110 0101 = 4 6 5(12 位数)

我们如何获得(12 位数)上面设置的权限(12 位数)?

0100 0110 0101

0000 0000 0111(&)

0000 0000 0101 = 5

因此,这就是我们如何获得 RESOURCEEXECUTE 权限。现在,如果我们想获得 RESOURCE 的 READ 权限怎么办? **** **** ****

0100 0110 0101

0111 0000 0000(&)

0100 0000 0000 = 1024

对?你可能会假设这个?但是,权限是 1024.我们只想获得资源的 READ 权限。别担心,这就是为什么我们有班轮运算符。如果我们看到,READ 权限是实际结果后面的 8 位,那么如果应用一些移位运算符,这会将 READ 权限带到结果的最右边?如果我们这样做:

0100 0000 0000 >> 8 => 0000 0000 0100(因为它是正数,所以用 0 代替,如果你不关心标志,只需使用无符号右移运算符)

我们现在实际上具有 4 的 READ 权限。

现在,例如,我们获得了 RESOURCE 的 READWRITEEXECUTE 权限,我们可以做些什么来为这个 RESOURCE 设置权限? **** ****

我们首先以二进制权限为例。 (仍然假设 4 位数系统)

READ = 0001

WRITE = 0100

执行= 0110

如果你认为我们会这样做:

READ | WRITE | EXECUTE,你有点对,但并不完全正确。看,如果我们将执行 READ |将会发生什么写| 执行

0001 | 0100 | 0110 => 0111

但是权限实际上被表示为(在我们的示例中)为 0001 0100 0110

因此,为了做到这一点,我们知道 READ 位于 8 位后面, WRITE 位于 4 位后面, PERMISSIONS 位于最后位置。用于 RESOURCE 权限的数字系统实际上是 12 位(在我们的示例中)。它可以(将)在不同的系统中有所不同。

(阅读<< 8)| (WRITE << 4)| (执行)

0000 0000 0001 << 8(阅读)

0001 0000 0000(左移 8 位)

0000 0000 0100 << 4(写)

0000 0100 0000(左移 4 位)

0000 0000 0001(执行)

现在,如果我们添加上述变换的结果,它将是类似的;

0001 0000 0000(阅读)

0000 0100 0000(写)

0000 0000 0001(执行)

0001 0100 0001(许可)