Java 如何证明m%n等于m&;(n-1)当n为2^k时?

Java 如何证明m%n等于m&;(n-1)当n为2^k时?,java,dictionary,hash,hashmap,thread-local,Java,Dictionary,Hash,Hashmap,Thread Local,请注意,“%”是余数运算符,“&”是位and运算符,k是大于0的整数 例如: 33%16=1 equivalent to 33&(16-1)=1 我在JDK1.8threadlocalmap中找到了这个等价物。我知道它是正确的,但不知道如何证明它是正确的。如果您能提供帮助,我将不胜感激。m%n是m除以n的余数,因此是一个介于0和n-1之间,或者介于0和2^k-1之间的数字 二进制中的2^k是一个后跟k个零。2^k-1是k个连续的 m&n是m&(2^k-1)是一个数字,在二进制中,1位必

请注意,“%”是余数运算符,“&”是位and运算符,k是大于0的整数

例如:

33%16=1 equivalent to 33&(16-1)=1

我在JDK1.8threadlocalmap中找到了这个等价物。我知道它是正确的,但不知道如何证明它是正确的。如果您能提供帮助,我将不胜感激。

m%n
是m除以n的余数,因此是一个介于0和n-1之间,或者介于0和2^k-1之间的数字

二进制中的2^k是一个后跟k个零。2^k-1是k个连续的

m&n
是m&(2^k-1)是一个数字,在二进制中,1位必须出现在最右边的k位中。因此,它在0到2^k-1的范围内


QED。

数学证明?是的,或者与编程相关的证明也能有所帮助。这是一个公认的数学恒等式。你不需要证明,就像你需要1+1=2的证明一样。@user207421 Cmon,它不是那么简单这是更加公理化的
2^k
总是
1
后面跟着
k
0,所以
n-1
只是
k
1的一个掩码。所以
m&(n-1)
给出了
m
的低位
k
位,就像
m%n
一样。