n & (n-1) 这个表达式是做啥的? [复制]
Posted
技术标签:
【中文标题】n & (n-1) 这个表达式是做啥的? [复制]【英文标题】:n & (n-1) what does this expression do? [duplicate]n & (n-1) 这个表达式是做什么的? [复制] 【发布时间】:2011-01-13 09:09:39 【问题描述】:可能的重复:Query about working out whether number is a power of 2What does this function do?
n & (n-1)
- 这个表达式可以用在哪里?
【问题讨论】:
检查这个问题:***.com/questions/3265942/what-does-this-function-do/… @Paul R,对我来说,这不是重复的(尽管相关)——有人可能会说,这个来自另一种方式。 它将最右边的1变成n的二进制模式的0。如果结果为 0,则表示 n 的二进制模式中只有一个 1,即 n 是 2 的幂。 【参考方案1】:它正在确定n
是 0 还是 2 的精确幂。
之所以有效,是因为 2 的二进制幂是 1000...000
的形式,减去一个将得到 111...111
。然后,当你将它们加在一起时,你会得到零,例如:
1000 0000 0000 0000
& 111 1111 1111 1111
==== ==== ==== ====
= 0000 0000 0000 0000
当您执行该操作时,任何非二次幂输入值(零以外)不会给您零。
例如,让我们尝试所有 4 位组合:
<----- binary ---->
n n n-1 n&(n-1)
-- ---- ---- -------
0 0000 0111 0000 *
1 0001 0000 0000 *
2 0010 0001 0000 *
3 0011 0010 0010
4 0100 0011 0000 *
5 0101 0100 0100
6 0110 0101 0100
7 0111 0110 0110
8 1000 0111 0000 *
9 1001 1000 1000
10 1010 1001 1000
11 1011 1010 1010
12 1100 1011 1000
13 1101 1100 1100
14 1110 1101 1100
15 1111 1110 1110
您可以看到只有0
和两个的幂(1
、2
、4
和 8
)导致0000/false
位模式,所有其他都是非零或@ 987654333@.
【讨论】:
怎么7和-1都有0111?n & (n-1)
有助于识别最后一位的值。由于 n 和 n-1 的最低有效位是 (0 and 1) 或 (1 and 0) 。参考上表。 (n & (n-1)) == 0
只检查 n 是 2 还是 0 的幂。
问题来自leetcode【参考方案2】:
如果 n 是 2 的幂,则返回 0(注意:仅适用于 n > 0
)。因此,您可以像这样测试 2 的幂:
bool isPowerOfTwo(int n)
return (n > 0) && ((n & (n - 1)) == 0);
【讨论】:
【参考方案3】:它检查 n 是否是 2 的幂:What does the bitwise code "$n & ($n - 1)" do?
【讨论】:
【参考方案4】:这是一个数字与其前一个数字之间的按位运算。只有当 n 是 2 的幂时,这个表达式才会为假,所以本质上你是在验证它是否不是 2 的幂。
【讨论】:
以上是关于n & (n-1) 这个表达式是做啥的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章