Algorithm (x%64)=(x&;63)背后的基本原理是什么?

Algorithm (x%64)=(x&;63)背后的基本原理是什么?,algorithm,bit-manipulation,bitwise-operators,Algorithm,Bit Manipulation,Bitwise Operators,可能重复: 有人能解释一下使这两个表达式等价的理由吗?我知道它只起作用,因为64是2的幂,但我如何从逻辑上或数学上从除法到按位,第一个给出余数 第二个是短路(按位和) 在按位AND中,63(二进制中为111111),因此LHS(x)上的任何内容都被AND,结果相同,除了MSB。Ans与64(二进制100000)的%的情况也是如此,除法和MSB保持不变。每次执行位移位时,这与除以2相同。这是因为二进制表示是以2为基数的。这和从基数10的123中去掉3得到12是一样的,就像123除以10一样 %是

可能重复:


有人能解释一下使这两个表达式等价的理由吗?我知道它只起作用,因为64是2的幂,但我如何从逻辑上或数学上从除法到按位,第一个给出余数

第二个是短路(按位和)


在按位AND中,63(二进制中为111111),因此LHS(x)上的任何内容都被AND,结果相同,除了MSB。Ans与64(二进制100000)的%的情况也是如此,除法和MSB保持不变。

每次执行位移位时,这与除以2相同。这是因为二进制表示是以2为基数的。这和从基数10的123中去掉3得到12是一样的,就像123除以10一样


%是mod运算符,表示除法的余数。64是2的六次幂,所以除以64就像是移出六位。除法的剩余部分是您移出的六位。您可以通过按位和仅设置较低的六位(63)来查找六位的值。

x
除以64时,操作
x%64
返回余数,该值(假设x>0)必须是介于0和63之间的数字。让我们以二进制形式看一下:

63dec=0011111b
64dec=0100000b

您可以看到,64的任意倍数的二进制表示必须以6个零结尾。因此,将任何数字除以64的余数是原始数字,除最右边的6位外,所有位都被删除


如果对一个带63的数字进行按位AND运算,结果正好是这6位。

@Blender:“可能重复”问题询问的数字不是2的幂,因此(非常)略有不同。@AdamLiss:一些答案概述了为什么会发生这种情况。因此它们是重复的答案,但不是重复的问题。:-)也许在你的评论中链接到其中一个更好?
x&63
的效果是保留
x
的最低6位二进制数字,并将其余的扔掉。如果我们使用十进制,请注意保持某个数字
x
的最后6位十进制数字与
x%1000000
相同。