如何使用逻辑函数
找到2的最大幂可以被整除例如144可以被16整除,即2 ^ 4。
如何做到这一点。
我知道二进制144是1001 0000,我必须使用按位函数。
但是我会使用什么(和orn orn?)或者其他什么呢?我可以用什么作为我的面具?
我知道你必须查看最正确的数字来判断它是否可被2整除。
感谢任何帮助
答案 0 :(得分:1)
我会选择n & -n
或n & (~n + 1)
,如果您担心运行一个补码算术,因为后者适用于两个算术。
如,
> 144 & (~144 + 1)
< 16
现在简短解释。
数字~
的按位NOT (即n
运算符)给出-(n + 1)
。它反转n
的所有位。数字2由00000010
表示,而其否定为11111101
,等于-3(即,请参见有号数字的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