检查数字是否为 2 的幂
如果整数 x
是 2 的幂,则只设置一个比特,而 x-1
之后设置所有比特。例如:4
是 100
而 3
是 011
作为二进制数,它满足上述条件。零不是 2 的幂,必须明确检查。
boolean isPowerOfTwo(int x)
{
return (x != 0) && ((x & (x - 1)) == 0);
}
左右移位的用法
我们假设,我们有三种权限, READ , WRITE 和 EXECUTE 。每个权限的范围从 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
因此,这就是我们如何获得 RESOURCE 的 EXECUTE 权限。现在,如果我们想获得 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 的 READ , WRITE , EXECUTE 权限,我们可以做些什么来为这个 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(许可)