如何通过使用逻辑函数可以找到2的最大幂?

时间:2014-03-09 20:20:05

标签: pseudocode sparc

如何使用逻辑函数

找到2的最大幂可以被整除

例如144可以被16整除,即2 ^ 4。

如何做到这一点。

我知道二进制144是1001 0000,我必须使用按位函数。

但是我会使用什么(和orn orn?)或者其他什么呢?我可以用什么作为我的面具?

我知道你必须查看最正确的数字来判断它是否可被2整除。

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

我会选择n & -nn & (~n + 1),如果您担心运行一个补码算术,因为后者适用于两个算术。

如,

> 144 & (~144 + 1)
< 16

现在简短解释。

数字~按位NOT (即n运算符)给出-(n + 1)。它反转n的所有位。数字2由00000010表示,而其否定为11111101,等于-3(即conversion from two's complement to decimal,请参见有号数字的two's complement表示。)

不要将其与逻辑否定混淆。

,例如~144 = -(144 + 1) = -145

按位AND (即&运算符)比较两位输入,如果两者都为1则生成结果1,否则返回0.

现在是主题。

这是一个老技巧,它给出 2的最高功效n可以被整除。这意味着返回一个带有一位的数字,特别是n 中设置的底部位。

例如,144的二进制表示是010010000。它的底部1位是第四位的位(从右向后计数并从位置0开始)。因此,除以144的2的较高幂是16(即00010000)。

144 & (~144 + 1) = 144 & -144 = 16
 16 & ( ~16 + 1) =  16 & - 16 = 16
 10 & ( ~10 + 1) =  10 & - 10 =  2
 12 & ( ~12 + 1) =  12 & - 12 =  4
 11 & ( ~11 + 1) =  11 & - 11 =  1
  3 & ( ~ 3 + 1) =   3 & -  3 =  1

请注意,如果n不能被任何2的幂除尽,则返回1。

为什么会这样?

n的负数是通过~反转其位来产生的,然后加1(再次看两个补码定义)。这个总和导致每1位(从底部开始)溢出,直到遇到0位(我们称之为 x 位)。这里溢出过程停止,剩余的位(超出当前 x 位的位)保持不变。因此,在&与其反向之间执行n将导致仅包含 x 位的二进制字符串。

以下是一个例子。

010010000 | +144 ~
----------|-------
101101111 | -145 +
        1 |
----------|-------
101110000 | -144 

101110000 | -144 & 
010010000 | +144
----------|-------
000010000 |   16